【问题标题】:What are Independent Associations and Foreign Key Associations? [duplicate]什么是独立关联和外键关联? [复制]
【发布时间】:2012-09-18 09:17:23
【问题描述】:

可能重复:
Code First: Independent associations vs. Foreign key associations?

在 EF 4 或 EF 5 Code First 中,什么是“独立关联”,什么是“外键关联”,如使用的 on MSDNForeign Key vs. Independent Relationships - is there improvement with Entity Framework 5?(已添加重点):

2.4.1 使用外键关联来降低视图生成成本

我们已经看到了许多在 从独立关联外键关联的模型 大大缩短了视图生成所花费的时间。

所以——现在我知道该使用哪个了。要是我知道它们是什么以及如何转换成它就好了!那么,我的问题是,您将如何定义这些术语?分别调用了哪些流利/注释/约定?

【问题讨论】:

  • @LadislavMrnka:我首先研究了这个问题,但发现它的定义并不太清楚,而且有一个稍微不同的主旨——即:为什么要使用其中一个,而不是简单地定义它们是什么.
  • 您应该修改您的问题,因为目前它询问这些关联是什么以及如何创建它们,而这正是链接问题所提供的。如果您还想知道为什么要使用它们中的每一个,请直接提出您的问题。
  • 我谦虚地请求不同。他在最后陈述了他的问题:“使用独立关联有什么明显的缺点吗?而且......如果没有,那么使用外键关联的原因是什么?”换句话说——“我为什么要使用每个?”我只想知道这两个短语的含义以及如何使某物成为其中的一个。
  • 我确实试图进一步澄清我的内容,但如果有帮助,请告诉我。
  • @ScottStafford:我完全同意你上面的 cmets,我在浏览了另一个问题的链接后也有同样的感觉。

标签: c# entity-framework-4 entity-framework-5


【解决方案1】:

我对为什么要使用独立或外键关联的看法:

独立协会

优点:

  • 这是进入面向对象世界的正确方法。在面向对象的世界中,我们在聚合中使用引用,而不是一些魔术键。

缺点:

  • 对于纯 POCO,您不知道主体关系是否真的为 NULL 或只是未加载,因为在这两种情况下您的引用都是 null。您必须要求上下文在这两个空值之间有所不同。这对于繁重的 EntityObject 基本实体来说不是问题,其中每个到主体实体的导航属性都与另一个后缀为 Reference 的属性配对,提供有关关系的一些额外详细信息。
  • EF 管理独立关联的方法非常复杂,尤其是在附加分离对象图时。每个独立的关联都有自己的状态,它永远不会处于Modified 状态。每次修改总是包括将旧关系设置为已删除并创建新关系作为添加 - 当您尝试使用它时,这真是一团糟。
  • 据报道,在 EF 初始化期间(或在视图预生成期间),独立关联会显着减慢视图生成速度。
  • 在您只需要绑定外键的数据绑定场景中,独立关联可能更难使用。

外键关联

优点:

  • 简单。关键属性易于管理,它们解决了独立关联的所有问题 - 没有外部关联的状态、直接数据绑定、关系存在时的即时可见性(关键不为空)等。

缺点:

  • 它们在概念上是错误的,在 EF 中提供它们是从对象世界到关系世界的一大步。我仍然相信正确的解决方案正在改进或改变独立关联的处理方式,即使它可能导致 EFv1 和 EFv4 之间发生巨大的破坏性变化。我也不喜欢目前的情况,即我们有两种行为完全不同的关联。应该只有一种类型具有明确定义的行为和在实体上公开的可选外键属性。

这种差异仅对一对多关联很重要,因为一对一始终是外键关联,而多对多始终是独立关联。

【讨论】:

  • +1 表示最后一句话。这对我一开始并不明显。
  • @Ladislav Mrnka - 这是一个很好的答案。我想知道这个答案是否有任何重大更新,因为 EF 在 v6 中推出?我目前正在设计一个全新的网络应用程序,我正在为我应该走的路而苦苦挣扎。
  • @meep:我不再与 EF 合作,但我认为 EF6 没有任何改变 - 你仍然有这两个选项。在处理分离的对象时,使用外键关联可以降低某些开发任务的复杂性,这在 Web 应用程序中经常发生。
【解决方案2】:

外键关联是除了相应的导航属性之外,您的模型中还有一个外键属性。独立关联是当您的数据库中有一个外键列但与该列对应的外键属性不在您的模型中 - 即您有一个 NavigationProperty 但没有外键属性可以告诉您 ID 值是什么相关属性没有实际转到相关属性。

这是一个具有独立关联的模型示例(请注意,从属没有外键 - 只是导航属性):

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

    [Required]
    public Principal PrincipalEntity { get; set; }

}

public class Principal
{
    public int Id { get; set; }
    public ICollection<Dependent> DependentEntities { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Dependent> Dependents { get; set; }
    public DbSet<Principal> Principals { get; set; }
}

这是一个相同模型的示例,但具有 ForeignKey 关联(注意 PrincipalEntity_Id 属性和 [ForeignKey()] 属性):

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

    public int PrincipalEntity_Id { get; set; }

    [Required]
    [ForeignKey("PrincipalEntity_Id")]
    public Principal PrincipalEntity { get; set; }

}

public class Principal
{
    public int Id { get; set; }
    public ICollection<Dependent> DependentEntities { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Dependent> Dependents { get; set; }
    public DbSet<Principal> Principals { get; set; }
}

请注意,您的数据库不会更改 - 基础数据库始终具有外键列,但具有独立关联,它没有公开。

使用外键关联,您只需更改外键的值即可更新关系。如果您知道该值,这很方便,因为您不需要加载要将导航属性更新到的实体。

【讨论】:

  • 这个和其他答案似乎没有触及性能问题。但是,根据 MSDN 文章中的2.2 Factors that affect View Generation performance 部分,使用独立关联似乎会增加视图生成的成本而不是外键关联
  • 我认为在最近的版本中对视图生成进行了改进,我认为它不再那么明显了。
猜你喜欢
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 2011-03-06
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多