Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是独立关联和外键关联?_C#_Entity Framework 4_Entity Framework 5 - Fatal编程技术网

C# 什么是独立关联和外键关联?

C# 什么是独立关联和外键关联?,c#,entity-framework-4,entity-framework-5,C#,Entity Framework 4,Entity Framework 5,可能重复: 在EF 4或EF 5代码中,首先,什么是“独立关联”和什么是“外键关联”,如使用或(强调添加): 2.4.1使用外键关联降低视图生成成本 我们已经看到了一些案例,其中在 模型从独立关联到外键关联 大大缩短了视图生成的时间 现在我知道该用哪个了。要是我知道它们是什么,以及人们会如何皈依它就好了!那么,我的问题是,你如何定义这些术语?什么样的fluent/annotations/conventions调用了它们?外键关联是指除了相应的导航属性外,模型中还有一个外键属性。独立关联是指当您

可能重复:

在EF 4或EF 5代码中,首先,什么是“独立关联”和什么是“外键关联”,如使用或(强调添加):

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

我们已经看到了一些案例,其中在 模型从独立关联外键关联 大大缩短了视图生成的时间


现在我知道该用哪个了。要是我知道它们是什么,以及人们会如何皈依它就好了!那么,我的问题是,你如何定义这些术语?什么样的fluent/annotations/conventions调用了它们?

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

下面是一个具有独立关联的模型示例(请注意,依赖项没有外键-仅导航属性):

依赖于公共类
{
公共int Id{get;set;}
[必需]
公共主体原则性{get;set;}
}
公共课校长
{
公共int Id{get;set;}
公共ICollection依赖项{get;set;}
}
公共类MyContext:DbContext
{
公共DbSet依赖项{get;set;}
公共数据库集主体{get;set;}
}
下面是同一个模型的一个示例,但具有ForeignKey关联(请注意PrincipalEntity_Id属性和[ForeignKey()]属性):

依赖于公共类
{
公共int Id{get;set;}
public int PrincipalEntity_Id{get;set;}
[必需]
[ForeignKey(“PrincipalEntity_Id”)]
公共主体原则性{get;set;}
}
公共课校长
{
公共int Id{get;set;}
公共ICollection依赖项{get;set;}
}
公共类MyContext:DbContext
{
公共DbSet依赖项{get;set;}
公共数据库集主体{get;set;}
}
请注意,您的数据库不会更改-基础数据库始终具有外键列,但与独立关联没有公开


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

关于为什么要使用独立键或外键关联,我的看法如下:

独立协会 优点:

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

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

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

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

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

@LadislavMrnka:我首先研究了这个问题,但发现它的定义和主旨不太清楚,即:为什么要使用一个或另一个,不要简单地定义它们是什么。你应该修改你的问题,因为此时它会询问这些关联是什么以及如何创建它们,而这正是链接问题所提供的。如果你还想知道为什么要使用它们中的每一个,请直接回答你的问题。我谦恭地表示不同意见。他在最后陈述了自己的问题:“使用独立关联是否有任何明显的缺点?如果没有,那么使用外键关联的原因是什么?”换句话说——“我为什么要使用每一个?”我想要的就是
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; }
}
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; }
}