2014-11-14 96 views
2

物業:處理嵌套表格與EF

  1. 我在這個順序3個表:Company -> Person -> Phone
  2. Company可以有多個Person,可以有多個Phone
  3. 它們全都有incremental INT作爲PK
  4. 他們有一個INDENTIFIED關係,所以Phoneid_phone & id_company & id_personPK

使用案例:

  1. 用戶想要一個CompanyPerson添加一個Phone

問題:

  1. 我如何添加一個PersonCompany,如果我沒有父母的PK? (同樣的情況,以Phone
+1

假設你有一個'Company'的實例,你應該只能寫'myCompany.Persons.Add(myPerson)' – MikeH 2014-11-14 19:23:23

+0

是的,我有這個實例。即使ID的值爲零,它也可以工作嗎? – 2014-11-14 19:30:46

+0

是的,當你保存你的更改時,EF會照顧鑰匙 – MikeH 2014-11-14 19:34:04

回答

3

的情況下將跟蹤添增所製作的子集合

var phone = new Phone() { //whatever }; 
var person = new Person() { //whatever }; 
person.Phones.Add(phone); 

var company = new Company() { //whatever }; 
company.People.Add(person); 

dbContext.Companies.Add(company); 
dbContext.SaveChanges(); 

只要您定義了關係,它會自動設置正確的外鍵等

下面是代碼首先爲例

public class Company 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id; 
    // other properties 
    public virtual Collection<Person> People { get; set; } 
} 

public class Person 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int Id; 
    // Other properties 
    [ForeignKey("Company")] 
    public int CompanyId { get; set; } 
    public virtual Company Company { get; set; } 
    public virtual Collection<Phone> Phones { get; set; } 
} 

UPDATE:你可以以類似的方式添加其他的孩子,你只需要獲取實體第一

var db = new DbContext(); 
var company = db.Companies.FirstOrDefault(x => x.Id == 1); 
if(company != null) 
{ 
    var person = new Person() { // blah }; 
    company.People.Add(person); 
    db.SaveChanges(); 
} 
+1

這是正確的答案。爲了完整起見,你可能想補充說,你不必定義主鍵,因爲它們是'AUTO_INCREMENT'。 – 2014-11-14 21:28:36

+0

是的,更多的習慣(我傾向於只使用guid鍵) – 2014-11-15 02:21:40

+0

從頭開始添加工作正常,但我不能在後面添加另一個'Person'到'Company'。我正在使用'_context.Entry(companyAux).CurrentValues.SetValues(company);' – 2014-11-21 17:03:43

2

只是做

company.Persons.Add(new Person 
    { 
     //set Person properties here but dont worry about PK - EF sorts this out for you 
    }); 

你甚至可以這樣做:

company.Persons.Addcnew Person 
    { 
     //set Person properties here but dont worry about PK - EF sorts this out for you 
     PhoneNumbers= new PhoneNumber[] 
     { 
      new PhoneNumber() {/*..*/ } 
     } 
    });