EF

2014-11-14 2 views
2

건물을 중첩 된 테이블을 취급하십시오 CompanyPhone 복수를 할 수있는 여러 Person을 가질 수 Company -> Person -> Phone EF

  • :

    1. 나는 순서로 세 테이블이있다.
    2. 이들 모두 incremental INT은 입니다.
    3. 그들은 indentified는 관계가 있으므로 Phone 등은 PKid_phone & & id_companyid_person있다.

    사용 케이스 :

    1. 사용자는 PhoneCompanyPerson 로모그래퍼를 추가하려고합니다.

    문제 : 부모의 PK이없는 경우

    1. 가 어떻게이 CompanyPerson를 추가 할 수 있습니까?
  • +1

    인스턴스가 '회사'라고 가정하면 'myCompany.Persons.Add (myPerson)'이라고 쓸 수 있습니다. – MikeH

    +0

    예, 인스턴스가 있습니다. ID가 0 인 경우에도 작동합니까? –

    +0

    예, 변경 사항을 저장할 때 EF가 키를 처리합니다 – MikeH

    답변

    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 키를 정의 할 필요가 없다고 추가 할 수 있습니다. –

    +0

    그래, 좀 더 습관적이다. (나는 단지 guid 키를 사용하는 경향이있다.) –

    +0

    처음부터 추가하면 잘되지만, 나중에 다른 'Person'을 'Company'에 추가 할 수는 없다. '_context.Entry (companyAux) .CurrentValues.SetValues ​​(company);를 사용하고 있습니다. –

    2

    그냥 당신도 할 수

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

    을 (동일한는 Phone에 발생) :

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