0

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

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; }属性,以及它的 Id in public int SuperEntityId { get; set; }

我已经花了几天时间进行实体设计,省略了 public int SuperEntityId { get; set; }“较低实体”中的属性。所以我只通过虚拟 SuperEntity 属性导航。一切正常!但是我有人告诉我它在数据库中创建了一个过多的表。我查过了,这不是真的。当我使用我的方法时,数据库表具有 SuperEntityId 列,并自动使用引用的实体 ID 填充它。那么这个public int SuperEntityId { get; set; }领域有什么意义呢?

或者,也许,我正在做的事情在 EF 的“新”版本(如 4.3)中可用?

4

2 回答 2

2

SuperEntityId 的要点是,有时在您的上下文不是一直处于活动状态的应用程序中使用外键属性更容易,例如 web 应用程序。在这种情况下,只使用外键属性比尝试将对象 B 附加到对象 A 要容易得多。
据我所知,使用导航属性,EF 使用一个对象来跟踪 2 个对象之间的关系。因此,如果您想将对象 B 耦合到对象 A,在断开连接的应用程序中,仅在对象 A 上设置属性是不够的,您还必须在 changetracker 中修改对象 A 的条目以注册 B 和A. 设置外键属性相当于这种摆弄。当我们刚开始使用 EF 并且不知道所有这些时,每次我们想连接 2 个对象,例如 B 到 A,并且 B 已经存在于 DB 中,上下文认为 B 是一个新对象而不是一个现有的,并复制数据库中的记录。

于 2012-08-13T10:54:15.210 回答
0

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

于 2012-08-13T10:34:17.927 回答