我一直在拉我的頭髮大約2天現在,因爲我根本無法獲得EF保存更改,只要我添加多對多許多實體到現有實體。更新實體框架6中的多對多導航屬性,更改不被保存
我的結構是普通的簡單:
我有一個表稱爲
Person
,它有一個ID(主,同一性),以及一些其他的字符串字段的表稱爲
Keyword
與一個ID(主,同一性)和稱爲Value
和
PersonKeywordRelation
,具有PersonId
字符串字段,和一個KeywordId
場
當我生成我的實體(數據庫第一),我得到一個類Person
,與ICollection<Keyword>
- 都好,按預期工作。
當我嘗試保存現有Person
時,出現了問題,並帶有修改後的關鍵字列表。只有標量屬性(字符串)被保存,而不是我的關鍵字!
- 我試過禁用延遲加載,沒有效果。
- 我嘗試從數據庫中再次加載每個單獨的關鍵字,沒有效果。
- 我嘗試將所有關鍵字加載到上下文中,以查看是否有助於EF檢測到更改,但沒有。
我很確定我不是唯一一個有過這個問題的人(事實上我完全相信,因爲我已經在這裏看到過幾個關於同一主題的問題,但我無法找到一個可行的答案...),主要針對較老版本的EF,這是另一個很好的理由,爲什麼我又開始了另一個問題:沒有任何改變能解決這個問題呢?
這是我的代碼,更新(和創建)的人。你會注意到我試圖讓EF保存相應的更改。
public void SavePersons(IList<Person> persons)
{
// Create a EF Context
using (var ctx = new MyDbEntities())
{
foreach (var person in persons)
{
// Attach
ctx.Persons.Attach(person);
// Insert or update?
ctx.Entry(person).State = person.Id == 0 ? EntityState.Added : EntityState.Modified;
// Get current keywords before clearing from entity
var keywords = new List<Keyword>(person.Keywords);
// Clear keywords from entity, so we can add fresh ones, hopefully
// EF will have an easier time handling this..
person.Keywords.Clear();
// Add keywords
keywords.ForEach(kw =>
{
ctx.Keywords.Attach(kw);
ctx.Entry(kw).State = EntityState.Modified;
person.Keywords.Add(kw);
});
}
// Save
ctx.SaveChanges();
}
}
您的關鍵字的值是否改變或者是人與關鍵字之間的關係是否改變? –
只有關係 - 但兩者都應該得到支持,最好。 – Jeff