【问题标题】:Creating a 1:1 relationship using EF CodeFirst使用 EF Code First 创建 1:1 关系
【发布时间】:2016-01-20 18:24:05
【问题描述】:

我首先与 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: : 多重性在关系“UserDetail_User”中的角色“UserDetail_User_Source”中无效。因为从属角色属性不是关键属性,所以从属角色的多重性的上限必须是'*'。

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

根据@steve-green 的评论在下面更新

我像史蒂夫建议的那样配置了 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; }
}

【问题讨论】:

标签: entity-framework ef-code-first


【解决方案1】:

去掉属性

  [ForeignKey("User") 

在用户详细信息中。另外,我会添加

  int UserDetailId 

给用户

这应该可以工作。

【讨论】:

    【解决方案2】:

    如果您要使用基表,那么您不能使用注释来执行此操作,因为(正如您所提到的)所需依赖项上的键需要是外键。您将需要流畅的 api 代码:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多