实体框架 - 错误:定义实体类型的密钥

时间:2011-06-28 10:48:18

标签: entity-framework

大家好,

我有以下简单的模型。

public class A
{
    public B B { get; set; }
    public C C { get; set; }

}

public class B
{
    public int Id { get; set; }


}

public class C
{
    public int Id { get; set; }

}

我在尝试获取数据时遇到错误:

  

System.Data.Edm.EdmEntityType ::   EntityType'A'没有密钥   定义。为此定义密钥   的EntityType。

之前它是通过“RelatedTo”完成的。在一个例子的帮助下,有没有人解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:1)

EF中的每个实体都必须有一个主键。看起来A是连接表,可以有多个选择。

删除A totaly并让EF处理多对多:

public class B
{
    public int Id { get; set; }
    public virtual ICollection<C> Cs { get; set; }
}

public class C
{
    public int Id { get; set; }
    public virtual ICollection<B> Bs { get; set; }
}

如果您想要A as实体,则必须定义其他键:

public class A
{
    public int Id { get; set; }
    public B B { get; set; }
    public C C { get; set; }
}

或者您必须包含B和C的FK属性,并将它们标记为复合主键(也应该在db中):

public class A
{
    public int bId { get; set; }
    public int cId { get; set; }
    public B B { get; set; }
    public C C { get; set; }
}

编辑:

最后一个解决方案的映射

modelBuilder.Entity<A>.HasKey(a => new { a.bId, a.cId });
modelBuilder.Entity<A>.HasRequired(a => a.B)
                      .WithMany()
                      .HasForeignKey(a => a.bId);
modelBuilder.Entity<A>.HasRequired(a => a.C)
                      .WithMany()
                      .HasForeignKey(a => a.cId);

无论如何,如果您的A看起来与您描述的完全没有任何其他属性,那么您肯定做错了。只有当它包含导航属性/ FK以建模多对多关系时,才需要映射A.