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

时间:2014-03-17 19:54:35

标签: entity-framework

我在创建与Entity Framework Code First的关联时遇到了一些问题。

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

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

     public string Name { get; set; }

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

我有一个关联表(因为我有很多关联,并且不想创建关联表的douzends)。在这个关联表中,我有一个返回ClassA的参考。然后,Association-Class看起来像

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 - &gt;关联:FromClassAId然后是Association的参考:ClassA(ClassAId) - &gt; 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(&#34; Associations&#34;)。包括(&#34; Associations.ClassA&#34;)(只是json格式以便更好地看:))

{
  ClassAId: 1,
  Name: 'Test Data 1',
  Associations: 
  [
    {
      FromClassAId: 1,
      ClassAId: 2,
      ClassA: 
      {
        ClassAId: 2,
        Name: 'Test Data 2'
      }
    },
    {
      FromClassAId: 1,
      ClassAId: 3,
      ClassA: 
      {
        ClassAId: 3,
        Name: 'Test Data 3'
      }
    }
  ]
}

使用上面设置的ForeignKey,我得到了关联引用,但没有得到&#34; self&#34; -referencing返回到关联的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; }
}

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

1 个答案:

答案 0 :(得分:0)

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

而不是&#34;协会&#34;键入并担心表格,只需要一个相同对象的列表。

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

     public string Name { get; set; }

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

...然后使用.Include(&#34; Associations&#34;)进行急切加载。 &#34; FromClassAId&#34;在某些其他实例的Association属性中找到ClassA的实例这一事实暗示了这一点。

将它留给Entity Framework来创建一个适用于添加,删除等的sql架构......如果EF创建的架构不符合您的喜好,那么您可以开始添加属性,流畅的api修改等。