为复杂实体定义导航属性的官方方法是:
public class SuperEntity
{
public int Id { get; set; }
//Other properties
}
public class LowerEntity
{
public int Id { get; set; }
public int SuperEntityId { get; set; }
public virtual SuperEntity SuperEntity { get; set; }
//Other properties
}
这里的主要内容是引用的类(允许导航到链接的超级实体)具有public SuperEntity SuperEntity { get; set; }
属性,以及它在public int SuperEntityId { get; set; }
中的ID。
我已经花了几天时间进入我的实体设计中,省略了“较低实体”中的public int SuperEntityId { get; set; }
属性。所以我只能通过虚拟SuperEntity属性进行导航。一切正常!但我有人告诉我,它在数据库中创建了一个过多的表。我检查了,但事实并非如此。当我使用我的方法时,DB表具有SuperEntityId列,并且只是自动用引用的实体Id填充它。那么public int SuperEntityId { get; set; }
字段的重点是什么?
或者,或许,我正在做的事情在“新鲜”版本的EF中可用,如4.3?
答案 0 :(得分:2)
SuperEntityId的观点是,有时在上下文不存在的应用程序中使用外键属性更容易,例如:一个webapp。
在这种情况下,使用外键属性比尝试将对象B附加到对象A要容易得多。
据我所知,使用导航属性,EF使用一个对象来跟踪两个对象之间的关系。因此,如果您想将对象B耦合到对象A,在断开连接的应用程序中,仅仅在对象A上设置属性是不够的,您还必须在变换跟踪器中调整对象A的条目以注册B和之间的关系。一个。
设置外键属性相当于这个小问题。
当我们刚开始使用EF并且不知道所有这些时,每次我们想要连接2个对象,例如B到A,B已经存在于DB中,上下文认为B是一个新对象而不是现有对象,并且重复了DB中的记录。
答案 1 :(得分:0)
它不会创建过多的表,但它可能会在该数据库上生成额外或更长的查询。但这取决于你如何使用这些实体。