2011-08-19 81 views
0

我有Person和Dog類。 一隻狗屬於一個人,一個人可以有不同的狗(所以一對多)。EF問題保存幾個實體之一

我有一個測試方法,從數據庫中獲取2人。如果一個人在db中不存在,我就可以做到。然後我想救4只狗。

這是測試:

Person person1= personResourceAccess.GetPersonByName("Person1"); 
     if(person1==null) 
     { 
      Person person = new Person() 
          { 
           Name = "Person1" 
          }; 
      person1= personResourceAccess.CreatePerson(person); 
     } 
Person person2= personResourceAccess.GetPersonByName("Person2"); 
      if(person2==null) 
      { 
       Person person = new Person() 
           { 
            Name = "Person2" 
           }; 
       person2= personResourceAccess.CreatePerson(person); 
      } 
Dog dog1 = new Dog(){name="Dog1", owner = person1}; 
Dog dog2 = new Dog(){name="Dog2", owner = person1}; 
Dog dog3 = new Dog(){name="Dog3", owner = person1}; 
Dog dog4 = new Dog(){name="Dog4", owner = person2}; 

dog1 = dogResourceAccess.CreateDog(dog1); 
dog2 = dogResourceAccess.CreateDog(dog2); 
dog3 = dogResourceAccess.CreateDog(dog3); 
dog4 = dogResourceAccess.CreateDog(dog4); 

這是對資源的訪問代碼:

public Dog CreateDog(Dog dog) 
    { 
     try 
     { 
      db.Dogs.AddObject(dog); 
      db.SaveChanges(); 
      return dog; 
     } 
     catch(Exception ex) 
     { 
      return null 
     } 
    } 

當我保存了第一隻狗,在數據庫中創建的所有其他狗。爲什麼會這樣,我怎樣才能防止它發生? 我認爲這可能與上下文有關,但似乎無法解決問題。

回答

1

這是正確的行爲。 SaveChanges始終保存當前由上下文跟蹤的所有更改。沒有辦法避免它 - 它被稱爲工作單位。發生這種情況的原因是在新狗的初始化中分配所有者。 Person已被上下文跟蹤,因此將其分配給任何其他實體將立即開始跟蹤該實體。

如果你想保存的序列變化,你必須這樣做不同的方式:

Dog dog1 = new Dog(){name="Dog1"}; 
dog1 = dogResourceAccess.CreateDog(dog1); 
dog1.owner = person1; // Attach the person after you added a new dog.