我目前正在使用實體框架的最新版本的項目,我遇到了一個問題,我似乎無法解決。實體框架,更新相關對象的問題
當涉及到更新現有對象時,我可以很容易地更新對象屬性,直到涉及到對另一個類的引用的屬性。
在下面的例子中,我有一個叫做Foo類,其存儲各種性質,與其它類
public class Foo
{
public int Id {get; set;}
public string Name {get; set;}
public SubFoo SubFoo {get; set}
public AnotherSubFoo AnotherSubFoo {get; set}
}
的這些是實例2當我使用下面編輯方法,我通過在對象我希望更新,我可以設法讓名稱正確更新,但是我還沒有設法找到一種方法來獲得SubFoo的屬性改變。例如,如果SubFoo類具有Name屬性,並且已更改,並且在我的數據庫和newFoo之間不同,它不會更新。
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
var entry = context.Entry<Foo>(dbFoo);
entry.OriginalValues.SetValues(dbFoo);
entry.CurrentValues.SetValues(newFoo);
context.SaveChanges();
return newFoo;
}
任何幫助或指針將不勝感激。
UPDATE: 基於由Slauma評論我已經修改了我的方法
public Foo Edit(Foo newFoo)
{
var dbFoo = context.Foo
.Include(x => x.SubFoo)
.Include(x => x.AnotherSubFoo)
.Single(c => c.Id == newFoo.Id);
context.Entry(dbFoo).CurrentValues.SetValues(newFoo);
context.Entry(dbFoo.SubFoo).CurrentValues.SetValues(newFoo.SubFoo);
context.SaveChanges();
return newFoo;
}
現在,當運行這個,我得到的錯誤
的實體類型Collection`1不是一部分的模型爲當前的 上下文。
爲了避免這個搞定了,我添加了代碼以嘗試將newFoo子類附加到上下文,但通過一個錯誤,指出該的ObjectManager已經有了一個實體相同
對象在ObjectStateManager中已經存在相同的密鑰。 的ObjectStateManager不能用相同的 關鍵
感謝您的評論,我已經發布了一個更新我的問題 – Thewads
@Thewads:我只能想象,你得到這個「*集合......是不是模型的一部分... *「錯誤,當'Foo.SubFoo'是一個*集合*類型。但它只是一個引用'公衆SubFoo SubFoo {get;在示例模型中設置},而不是集合。它真的沒有收藏?我的回答是基於你當前的模型,其中'SubFoo'不是一個集合。 – Slauma
對不起,我沒有意識到有收藏的模型會有所作爲......我的錯誤。在我處理的模型中:public ICollection SubFoo {get;設置;} –
Thewads