大家好,
我有以下简单的模型。
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”完成的。在一个例子的帮助下,有没有人解决这个问题?
提前致谢!
答案 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.