Entity framework 使用EF CodeFirst创建1:1关系

Entity framework 使用EF CodeFirst创建1:1关系,entity-framework,ef-code-first,Entity Framework,Ef Code First,我首先与EF代码作斗争,并试图毫无乐趣地绘制一个1:1的关系图 基本上,用户可以拥有userdetail 我正在两个表上设置主键。在我的UserDetail表上,有一个字段UserId,我正试图用作FK public class User:BaseModel { public virtual UserDetail UserDetail { get; set; } public string UserName { get; set; } } public class UserDet

我首先与EF代码作斗争,并试图毫无乐趣地绘制一个1:1的关系图

基本上,用户可以拥有userdetail

我正在两个表上设置主键。在我的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; }
}
当我尝试使用
addmigration
命令时,我得到了这个错误

UserDetail\u User\u Source::多重性在关系“UserDetail\u User”中的角色“UserDetail\u User\u Source”中无效。因为依赖角色属性不是键属性,所以依赖角色的多重性上限必须为“*”

我需要做什么才能让它工作?这当然不应该那么难吧

根据@steve green的评论更新如下

我按照史蒂夫的建议配置了fluentapi

   modelBuilder.Entity<User>()
                    .HasRequired(t => t.UserDetail)
                    .WithRequiredPrincipal(t => t.User);
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; }
}

去掉属性

  [ForeignKey("User") 
详细地。我还要补充一点

  int UserDetailId 
对用户


这应该会起作用。

如果要使用基表,则不能使用注释,因为(正如您所提到的)所需依赖项上的键必须是外键。您需要流畅的api代码:

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

可能的重复部分略有不同。我的模型无法在主键上添加[ForeignKey]属性。因为我的所有模型都继承自具有主键的基本模型类。我将更新我的代码示例
modelBuilder.Entity<User>() 
    .HasRequired(t => t.UserDetail) 
    .WithRequiredPrincipal(t => t.User);