給出的關係:實體框架:ChildCollection項目去除
人1 - * TelephoneNumber
(一個人有0,1或更多TelephoneNumber實體)
而我的積分測試:
[TestMethod()]
public void DeleteTelephoneNumberAndSavePersonTest()
{
Person person;
using (SopEntities sopEntities = EntitiesFactory.Create(Properties.Resources.ConnectionString))
{
PeopleRepository target = new PeopleRepository(sopEntities);
person = target.GetPerson(7);
Assert.IsTrue(person.TelephoneNumbers.Any());
Assert.AreEqual("DeleteTelephoneNumberAndSavePersonTest", person.TelephoneNumbers.Single().Number);
person.TelephoneNumbers.Remove(person.TelephoneNumbers.Single());
target.SavePerson(person);
Person savedPerson = target.GetPerson(7);
Assert.IsFalse(savedPerson.TelephoneNumbers.Any());
}
}
其中獲得已經創建(an d我知道這是真實的)Person(ID = 7)在其TelephoneNumbers集合中有一個TelephoneNumber。這工作正常。
然後我刪除TelephoneNumber作爲我的測試的一部分。
,並保存它,使用下面的代碼:
public Person SavePerson(Person person)
{
if (person == null)
throw new ArgumentNullException("person");
Person existingPerson= SopEntities.People.Include("EmailAddresses").Include("TelephoneNumbers").Include("WebResources").SingleOrDefault(q => q.ID==person.ID);
// NOTE: The existingPerson ALREADY has the TelephoneNumber removed, even though retrieved from the DB again. WHY IS THIS?
// snip: collection reconciliation code
SopEntities.SaveChanges();
return existingPerson;
}
我不想分心這個帖子在內存中,以持久的集合在這一點上的和解,但希望能引起您的關注現有人的發現。當我對此進行調試時,此人已將TelephoneNumber從TelephoneNumbers集合中刪除。
原因是它在TestMethod中的相同Entities上下文中。如果我在加載TelephoneNumber和刪除項目之間創建新的上下文,則在適當的時候,檢索到的Person在TelephoneNumbers集合中具有預期的TelephoneNumber以供刪除。
EntityFramework顯然緩存了這個變化,並且將這個變化「投射」到了一個更好的單詞中。我不希望發生這種情況。
如何防止此行爲?即。當我詢問數據庫內容時,我想知道數據庫內容,而不是EF對數據庫內容的印象。
對我來說,你的問題看起來像一個XY問題:你想達到X並嘗試通過Y解決它,但Y不工作,你問爲什麼Y不工作,你如何改變Y使它工作。如果你問X(解釋,用'Save'方法加載未修改人的目的是什麼),你可能會得到更好的答案。 – Slauma 2012-04-27 17:06:19
對不起,我不清楚代碼中分散注意力的元素。它*看起來像我從SopEntities結果返回existingPerson,但缺少的部分代碼是我正在更新在已存在的實體中返回的對象。 但這不是問題所在。問題是從Person.TelephoneNumbers集合中刪除TelephoneNumber,然後提交它將它從ObjectContext中刪除,所以我無法調和保存期間的差異。 我懷疑我的存儲庫模式不合格。謝謝你的幫助。 – 2012-04-30 09:16:29