使用EF CodeFirst创建1:1关系

时间:2016-01-20 18:24:05

标签: entity-framework ef-code-first

我首先与EF代码作斗争并试图以1:1的关系进行映射而没有快乐。

用户基本上可以拥有用户详细信息。

我在两个表上设置主键。在我的UserDetail表上有UserId字段我试图用作FK。

public class User:BaseModel
{
    public virtual UserDetail UserDetail { get; set; }
    public string UserName { get; set; }
}
public class UserDetail:BaseModel
{
    public virtual User User { get; set; }
    [ForeignKey("User")]
    public int UserId { get; set; }
    public string UserDetailName { get; set; }
}
public class BaseModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
}

当我尝试使用add-migration命令时,我收到此错误

  

UserDetail_User_Source :: Multiplicity在Role' UserDetail_User_Source'中无效。 in relationship' UserDetail_User'。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为' *'。

我需要做些什么才能让这个工作?当然这不应该那么困难吗?

  

根据@ steve-green

的评论更新以下内容

我配置了像steve建议的fluentapi

   modelBuilder.Entity<User>()
                    .HasRequired(t => t.UserDetail)
                    .WithRequiredPrincipal(t => t.User);

然而,生成的迁移步骤对我来说是错误的

  CreateTable(
            "dbo.Users",
            c => new
                {
                    UserId = c.Int(nullable: false, identity: true),
                    UserName = c.String(),
                })
            .PrimaryKey(t => t.UserId);

        CreateTable(
            "dbo.UserDetails",
            c => new
                {
                    UserDetailId = c.Int(nullable: false, identity: true),
                    UserId = c.Int(nullable: false),
                    UserDetailName = c.String(),
                })
            .PrimaryKey(t => t.UserDetailId)
            .ForeignKey("dbo.Users", t => t.UserDetailId)
            .Index(t => t.UserDetailId);

FK配置为UserDetailId,不应该是UserId

略有修改的模型

public class UserDetail
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserDetailId { get; set; }
    public virtual User User { get; set; }
    public int UserId { get; set; }
    public string UserDetailName { get; set; }
}

2 个答案:

答案 0 :(得分:0)

删除属性

  [ForeignKey("User") 
在UserDetail中

。另外,我会添加

  int UserDetailId 

到用户

那应该有用。

答案 1 :(得分:0)

如果要使用基表,则不能使用注释,因为(如您所述)所需的依赖关键字需要是外键。你需要流畅的api代码:

modelBuilder.Entity<User>() 
    .HasRequired(t => t.UserDetail) 
    .WithRequiredPrincipal(t => t.User);

https://msdn.microsoft.com/en-us/data/jj591620.aspx#RequiredToRequired