在Entity Framework中实现导航属性的另一种方法

时间:2012-08-13 10:30:34

标签: entity-framework

为复杂实体定义导航属性的官方方法是:

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?

2 个答案:

答案 0 :(得分:2)

SuperEntityId的观点是,有时在上下文不存在的应用程序中使用外键属性更容易,例如:一个webapp。 在这种情况下,使用外键属性比尝试将对象B附加到对象A要容易得多。
据我所知,使用导航属性,EF使用一个对象来跟踪两个对象之间的关系。因此,如果您想将对象B耦合到对象A,在断开连接的应用程序中,仅仅在对象A上设置属性是不够的,您还必须在变换跟踪器中调整对象A的条目以注册B和之间的关系。一个。 设置外键属性相当于这个小问题。 当我们刚开始使用EF并且不知道所有这些时,每次我们想要连接2个对象,例如B到A,B已经存在于DB中,上下文认为B是一个新对象而不是现有对象,并且重复了DB中的记录。

答案 1 :(得分:0)

它不会创建过多的,但它可能会在该数据库上生成额外或更长的查询。但这取决于你如何使用这些实体。