实体框架(代码优先)一对多和一对一关系(有两个实体)。如何?

时间:2015-02-09 20:51:25

标签: entity-framework one-to-many code-first one-to-one relationships

我尝试使用EF Code First:

database model

区域有两个表:用户和区域。一个用户属于一个必需区域,一个区域可以有零个或一个用户(作为管理员)。然后:

用户* .. 1区域和 用户0..1区域

用户类:

public class User {
    public int UserId { get; set; }
    public string Name { get; set; }

    [ForeignKey("Area")]
    public int AreaId { get; set; }
    [InverseProperty("Users")]
    public virtual Area Area { get; set; }

    public virtual Area AreaTitular { get; set; }
}

The Areas类:

public class Area {
    public int AreaId { get; set; }
    public string Name { get; set; }

    public List<User> Users { get; set; }

    [ForeignKey("User")]
    public int? UserId { get; set; }
    [InverseProperty("AreaTitular")]
    public virtual User User{ get; set; }
}

update-database命令的错误:

  

无法确定类型之间关联的主要结尾&#39; TestEntityFrameworkCodeFirst.Model.Area&#39;和&#39; TestEntityFrameworkCodeFirst.Model.User&#39;。必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

非常感谢任何帮助:)

我不完全确定这是否可以:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    modelBuilder.Entity<Area>()
        .HasOptional(i => i.User)
        .WithOptionalDependent();
    base.OnModelCreating(modelBuilder);
}

刚刚在Context类的OnModelCreating上添加了这个。这就是它在SQL Server中的外观:

Database

1 个答案:

答案 0 :(得分:3)

问题在于您的一对一关系的配置,因为一端必须是主体,第二端必须是依赖。当您配置这种关系时,Entity Framework要求依赖的主键也是外键。因此,不要将UsuarioId映射为FK,否则,EF要求FK也必须是PK(评论该财产)。另一个问题是EF不知道谁是你们关系中的主体。要指定谁是主体,请使用Required属性。例如,如果您在AreaTitular上添加此属性,则指定要创建User,保存更改后必须设置AreaTitular属性,因此在这种情况下您的主体是Area,dependend是User,但这是假设的情节,我不知道你的逻辑。 查看此帖子了解更多信息:

现在,可以将两端都指定为可选,但其中一个必须是主体。如果是这种情况,我建议您注释数据注释属性并使用Fluent Api以这种方式配置关系:

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
   {
        modelBuilder.Entity<User>()
            .HasRequired(a => a.Area)
            .WithMany(c => c.Usuarios)
            .HasForeignKey(a => a.AreaId);

        modelBuilder.Entity<Area>()
            .HasOptional(a => a.Usuario)
            .WithOptionalPrincipal(u => u.AreaTitular);
   }

我建议您阅读此page以更好地理解一对一的关系。