2013-02-08 126 views
2

我有兩個實體:人員和公司。一個公司有一個或多個聯繫人(人)。一家公司至少有一個主要聯繫人(人)。什麼是實施這個最好的方法?EF 5 Code First:兩個實體之間的一對一和一對多關聯

enter image description here

這裏是實體:

public class Person 
{ 
    public int PersonId { get; set; } 
    public string PersonName { get; set; } 
} 
public class Company 
{ 
    public int CompanyId { get; set; } 
    public string CompanyName { get; set; } 
    public virtual ICollection<Person> Contacts { get; set; } 
    public int PrimaryContactId { get; set; } 
    [ForeignKey("PrimaryContactId")] 
    public virtual Person PrimaryConctact { get; set; } 
} 

上下文和初始化器:

public class TolleContext : DbContext 
{ 
    public DbSet<Company> Companies { get; set; } 
    public DbSet<Person> Persons { get; set; } 
    public TolleContext() 
    { 
     Database.SetInitializer(new TolleContextInitializer()); 
    } 
} 
public class TolleContextInitializer : DropCreateDatabaseAlways<TolleContext> 
{ 
    protected override void Seed(TolleContext context) 
    { 
     var p1 = context.Persons.Add(new Person { PersonName = "Anatoly" }); 
     var p2 = context.Persons.Add(new Person { PersonName = "Johannes" }); 
     var contacts = new List<Person> {p1, p2}; 
     var company = new Company 
      { 
       CompanyName = "Bool", 
       PrimaryConctact = p1, 
       Contacts = contacts 
      }; 
     context.Companies.Add(company); 
     context.SaveChanges(); 

     base.Seed(context); 
    } 
} 

如果我一個人作爲一個PrimaryContact的公司聯繫起來,它不出現在company.Contacts。當我一個人作爲主要聯繫人相關聯,並加入到爲同一家公司的聯繫人列表,它拋出一個錯誤:

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

我希望有關實現這樣的場景可能的方式回答。

+0

您的類圖有點誤導,您有'Company.Contacts',但您的關係線表示它是1對1的關係。一家公司只能有一個聯繫人和一個主要聯繫人? – CodingGorilla 2013-02-08 16:25:36

+0

爲什麼你將PrimaryContact分離出來而不是Person上的字段? – IronMan84 2013-02-08 16:43:54

+0

謝謝@CodingGorilla和IronMan84我已經更新了類圖。我將嘗試將PrimaryContact關聯作爲Person上的字段。 – 2013-02-08 17:00:23

回答

1

顯然Person不能屬於多個公司。所以你可以讓Primary屬性爲Person。它降低了模型複雜性:您只需要一對多關聯。然而,這增加了業務邏輯的複雜性:(1)你需要獲得通過

company.Persons.Where(p => p.IsPrimary).First(); 

主要聯繫人這是不一樣閱讀導航屬性一樣容易,和(2),你需要的邏輯,以確保只有一個Person是主要的。

如果要保留當前模型,應先保存公司及其聯繫人,然後在第二個事務中分配主要聯繫人。當你在一個事務中執行它時,EF可以同時設置兩個生成的外鍵。它必須首先爲公司的FK創建公司,並首先爲公司的FK創建公司。

+0

謝謝!聽起來不錯。我現在正在設計我的模型,所以我不會被迫保留我的模型。如果我遵循您的建議並創建IsPrimary屬性,那麼確保公司每次只有一個主要聯繫人的最佳方法是什麼?我感謝你的回答! – 2013-02-09 14:05:10

+0

只是「蠻力」:做一個主要的,並檢查其他人是否。 – 2013-02-09 15:11:17

+0

謝謝你的幫助。它必須是首先在EF代碼中實現此功能的最佳方法。 – 2013-02-16 14:02:24

相關問題