我在创建与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可能会遇到一些问题,其中只有子类中的后引用被命名为母类中的主键。
答案 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修改等。