Entity framework 实体框架:具有自引用的多对一关联

Entity framework 实体框架:具有自引用的多对一关联,entity-framework,Entity Framework,我在创建与实体框架代码的关联时遇到一些问题 在这个问题中,我有一个类,我们称它为ClassA,它看起来像 public class ClassA { [Key] public int ClassAId { get; set; } public string Name { get; set; } [ForeignKey("FromClassAId")] public virtual List<Association> Associa

我在创建与实体框架代码的关联时遇到一些问题

在这个问题中,我有一个类,我们称它为ClassA,它看起来像

public class ClassA
{
     [Key]
     public int ClassAId { get; set; }

     public string Name { get; set; }

     [ForeignKey("FromClassAId")]
     public virtual List<Association> Associations { get; set; }
}
public class Association
{
     [Key]
     public int AssociationId { get; set; }

     public int FromClassAId { get; set; }

     public int ClassAId { get; set; }

     public ClassA ClassA { get; set; }
}
因此,从ClassA中,有一个对ClassA:ClassAId->Association:FromClassAId的关联的引用,然后是对Association:ClassA(ClassAId)->ClassA:ClassAId的引用

因此,以下是数据库中的数据

ClassA

ClassAId     Name
-------------------------------------------------------------------------
1            Test Data 1
2            Test Data 2
3            Test Data 3
关联

AssociationId     FromClassAId    ClassAId
---------------------------------------------------------------------------
1                 1               2
1                 1               3
应该返回以下对象(带有.Include(“Associations”).Include(“Associations.ClassA”)(为了更好地查看,只使用json格式:)

使用如上所述的ForeignKey集,我获得了关联引用,而不是从关联返回到ClassA对象的“自”引用。我尝试了几种配置,但无法成功恢复ClassA引用。也许我犯了个脑病:)

谢谢

解决方案

我找到了解决方案,在调试和使用SQL分析器之后,可能有人也有同样的问题

public class ClassA
{
     [Key]
     public int ClassAId { get; set; }

     public string Name { get; set; }

     [ForeignKey("ClassAId")]
     public virtual List<Association> Associations { get; set; }
}

public class Association
{
     [Key]
     public int AssociationId { get; set; }

     public int ClassAId { get; set; }

     public int ToClassAId { get; set; }

     [ForeignKey("ToClassAId")]
     public ClassA ClassA { get; set; }
}
公共类ClassA
{
[关键]
公共int类援助{get;set;}
公共字符串名称{get;set;}
[外键(“ClassAId”)]
公共虚拟列表关联{get;set;}
}
公共阶级协会
{
[关键]
公共int AssociationId{get;set;}
公共int类援助{get;set;}
public int toclasssaid{get;set;}
[外键(“ToClassAId”)]
public ClassA ClassA{get;set;}
}

当同时使用两个FK时,EF可能会遇到一些问题,其中子类中只有back引用的命名与母类中的主键类似。

在代码优先中,作为开发人员,您不必担心数据库将如何反映您的数据模型,只需创建对您的数据/域模型有意义的C类即可(无论如何,在大多数情况下)。这是像EF Code first这样的对象关系映射器背后的哲学区别。您扮演软件开发人员的角色,让EF Code first成为DBA(至少在基础上)

与“关联”类型和担心表不同,只需拥有相同对象的列表

public class ClassA
{
     [Key]
     public int ClassAId { get; set; }

     public string Name { get; set; }

     public virtual List<ClassA> Associations { get; set; }
}
公共类ClassA
{
[关键]
公共int类援助{get;set;}
公共字符串名称{get;set;}
公共虚拟列表关联{get;set;}
}
…然后您使用.Include(“Associations”)进行的快速加载将起作用。“FromClassAId”的含义是您在其他实例的Association属性中找到了ClassA的实例


让实体框架来创建sql模式,用于添加、删除等。如果EF创建的模式不符合您的喜好,那么您可以开始添加属性、fluent api修改等。

您放置的关联表中是否有o型?它看起来像重复的主键。嗨,我看不到o型。主键f或者此表是AssociationId。从/到ClassA表有两个引用。FromClassAId是ClassA用于在ClassA和关联(一对多)之间进行关联的引用,ClassAId应用于从association到ClassA(在关联内的ClassA对象上)的一对一引用。我在关联表示例项中看到有两行的AssociationId为1。在您的数据模型中,您将主键指定为AssociationId,因此我想知道这是否是伪数据,否则您会有一个重复的主键?啊,我明白了-是的,这是示例数据中的o类型。我刚刚查看了类定义。Y你是对的,第二行应该有一个AssociationId为2Yes,这是可行的,但我稍后会在这个关联表classb、classc等中使用,其中关联可以引用回其他classa(或classb)类型。因此,当我有一个新的表/实体时,我不需要更改很多实体,而只需要更改全局关联表。@jjf在不了解您试图在C#中建模的问题的情况下,我建议您只考虑这个问题,以及它在C#而不是SQL中的意义。对我来说,考虑使用EF CodeFirst的SQL是一个很好的选择除非您试图绕过EF的限制,否则代码会有味道。如果您正在考虑在C#中实现sql,则您没有将EF用于其预期目的或最大限度地使用。是的,EF有其优点和缺点。我总是查看EF迁移生成的数据库定义,并在需要时对其进行更改。我不认为,使用EF代码会有好处和缺点-首先,关注生成的数据库结构是一种对立。代码设计始终处于性能、类型安全性、可扩展性和(单元)测试之间。
public class ClassA
{
     [Key]
     public int ClassAId { get; set; }

     public string Name { get; set; }

     public virtual List<ClassA> Associations { get; set; }
}