代码优先的可选一对一关系

针对有两个表(客户和用户)的情况编写模型。每个用户记录可能都有一个可选的相关客户记录,反之亦然,但都不是必须的。我发现FK Associations不是我所需要的,而是我所需要Independent Associations的。但是我只是找到一种使它起作用的方法,我不断收到“无法确定主体端...必须使用关系流利的API或数据注释来显式配置此关联的主体端”。例外。

我的模型非常简单:

public class User
{
    [Key]
    public int          Id              { get; set; }
    [StringLength(20)]
    public string       CustomerId      { get; set; }
    public string       Password        { get; set; }
    public bool         Locked          { get; set; }

    //[ForeignKey("CustomerId")]
    public virtual Customer Customer    { get; set; }
}

public class Customer
{
    [Key]
    [Column("Id", TypeName = "nvarchar")]
    [StringLength(20)]
    public string       Id              { get; set; }   //  nvarchar    20
    [Required]
    public string       GivenName       { get; set; }   //  nvarchar    100
    [Required]
    public string       Surname         { get; set; }   //  nvarchar    100

    //[InverseProperty("Customer")]
    public virtual User User            { get; set; }
}

我试图添加ForeignKeyAttribute和InversePropertyAttribute,它们目前已被注释掉,但是它们都没有帮助。如果可能的话,我宁愿使用数据注释而不是流畅的API。

八叶球菌

一对一关系中,一端必须是主体,第二端必须是从属关系主体端是将首先插入的端,并且可以存在而无需从属端。从属端是必须在主体后插入的一端,因为它具有主体的外键。在配置一对一关系时,实体框架要求从属的主键也应ForeignKey为外键。通过在从属类上使用注释来标识它包含外键,最容易解决此问题在您的情况下,Customer可能是受抚养者及其关键,Customer.UserId,也应该是外键。但是两个键必须使用相同的类型声明:

public class User
{
   [Key]
   public int  Id  { get; set; }

   public virtual Customer Customer { get; set; }
}

public class Customer
{
   [Key, ForeignKey("User")]
   public int  UserId { get; set; }

   public virtual User User{ get; set; } 
}

我不知道如何使用数据注释解决问题,但是如果您想使用Fluent Api,我认为该关系的配置应如下所示:

 modelBuilder.Entity<User>().HasOptional(u => u.Customer).WithOptionalPrincipal(c => c.User);

更新

我了解您的情况,但是如果您在模型中显示的列相同,那么我认为您应该在数据库中映射一对多关系,而不是一对一。尝试通过以下方式映射您的关系:

public class User
{
    [Key]
    public int Id { get; set; }

    public string Password { get; set; }
    public bool Locked { get; set; }

    public string CustomerId { get; set; }

    [ForeignKey("CustomerId")]
    public virtual Customer Customer { get; set; }
}

public class Customer
{
    [Key]
    [Column("Id", TypeName = "nvarchar")]
    [StringLength(20)]
    public string Id { get; set; }   //  nvarchar    20
    [Required]
    public string GivenName { get; set; }   //  nvarchar    100
    [Required]
    public string Surname { get; set; }   //  nvarchar    100

    public virtual  ICollection<User> Users { get; set; }
}

请记住,使用与数据库中相同的列名映射属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

EF代码优先:使用数据注释设置可选的一对一关系

来自分类Dev

实体框架代码优先一对一关系

来自分类Dev

一对零或一对一关系的实体框架(EF)代码优先级联删除

来自分类Dev

插入一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系插入

来自分类Dev

休眠一对一关系

来自分类Dev

建立一对一关系

来自分类Dev

GSON一对一关系

来自分类Dev

休眠一对一关系

来自分类Dev

一对一关系

来自分类Dev

MYSQL一对一关系

来自分类Dev

实现一对一关系

来自分类Dev

与查询的一对一关系

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

EF6代码优先-使用不匹配的外键配置一对一关系

来自分类Dev

如何创建一对一关系,双方关系都是可选的

来自分类Dev

如何使用“数据库优先”建立一对一关系?

来自分类Dev

实体框架两端可选的一对一关系

来自分类Dev

使用默认约定的一对一关系和可选的依赖端

来自分类Dev

如何在EntityFramework中映射可选的一对一关系

来自分类Dev

使用默认约定的一对一关系和可选的依赖端

来自分类Dev

C#实体框架:可选的一对一关系

来自分类Dev

与同一模型的雄辩一对一关系

来自分类Dev

实体框架首先使用代码一对一关系。怎么样?

来自分类Dev

首先通过代码以一对一关系更新ViewModel

来自分类Dev

实体框架代码首先在复杂实体之间建立一对一关系

来自分类Dev

休眠一对一关系错误