如何用流畅的api定义复杂的(1到0 | n)实体框架关系?

时间:2012-05-17 14:20:50

标签: entity-framework

我有以下(简化)课程:

public class Person
{
   public string Id {get; set;}  //Ignore the fact that the Id is string -- legacy system
   public string Firstname {get; set;}
   public ICollection<Member> Memberships {get; set;}
   ...
}

public class Account
{
   public string Id {get; set;}
   public string AccountType {get; set;}
   ...
}

public class Member
{
   public string AccountNumber {get; set;}
   public string PersonNumber {get; set;}
   public Account Account {get; set;}
   public Person Person {get; set;}
   ...
 }

以及以下EF配置:

//In Accounts configuration class
ToTable("missacct");
HasKey(a => a.Id);

//In Members Configuration class
ToTable("members");
HasKey(a => new { a.AccountNumber, a.PersonNumber});
HasRequired(a => a.Person).WithMany().HasForeignKey(p => p.PersonNumber);
HasRequired(a => a.Account).WithMany().HasForeignKey(a => a.AccountNumber);

//In Persons Configuration Class
ToTable("person");
HasKey(p => p.Id);
HasMany(p => p.Memberships).WithOptional().HasForeignKey(p => p.PersonNumber);

这里的意图是有人和帐户。没有成员就不能存在帐户,而成员永远是个人。但是,一个人可以在不成为帐户成员的情况下存在。

我的想法是希望能够查询以下内容:

  1. 根据特定的帐号,我想找到帐户中的所有人。
  2. 鉴于名字/姓氏组合我想找到所有具有匹配名字的人以及他们可能成为的任何帐户。
  3. 我现在所用的东西似乎没有用。我收到循环引用错误,但我不太确定我哪里出错了。

    感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

您正在定义两个单独的关系,而不是一个双向关系。试试这个:

//In Accounts configuration class
ToTable("missacct");
HasKey(a => a.Id);

//In Members Configuration class
ToTable("members");
HasKey(a => new { a.AccountNumber, a.PersonNumber});
HasRequired(m => m.Person).WithMany(p => p.Memberships).HasForeignKey(p => p.PersonNumber);
HasRequired(m => m.Account).WithMany().HasForeignKey(a => a.AccountNumber);

//In Persons Configuration Class
ToTable("person");
HasKey(p => p.Id);
HasMany(p => p.Memberships).WithOptional(m => m.Person).HasForeignKey(p => p.PersonNumber);
  

如果没有成员,帐户就不能存在......

您必须在应用程序逻辑中强制执行此部分。在关系级别,您只能说会员必须拥有一个帐户。