我使用MVC 3中的EF4 POCO和UnitOfWork/repository模式。我想了解如何修改要插入的新記錄。如何在EF4中提交之前更新新記錄?
我的服務方法插入/更新看起來像這樣(倉庫在服務構造通過的IoC注入):
public void UpdateData(Guid id, int newValue)
{
MyPoco poco = _repository.FirstOrDefault(p => p.Id = id);
if (poco == null)
{
poco = new Poco
{
//set properties
};
_repository.Add(poco);
}
poco.SomeFieldToUpdate = newValue;
}
我的變化獲得通過我的UnitOfWork堅持上一個UseUnitOfWorkAttribute行爲過濾我控制器:
void IResultFilter.OnResultExecuted(ResultExecutedContext filterContext)
{
var unitOfWork = IoCFactory.Instance.CurrentContainer.Resolve<IUnitOfWork>();
unitOfWork.Commit();
}
當然,如果這是有史以來打只有一次,對於現有的或新的數據能正常工作。如果它已經存在,它可以在多次通行證中正常工作。
但是,如果Guid值不存在於表中,那麼它會嘗試執行多次插入(如果多次調用)。
所以這是我的困境。我明白爲什麼這不起作用,我只是不確定解決問題的正確方法。基本上,我需要以某種方式獲得對UnitOfWork中現有POCO的引用,並以某種方式更新它。但UnitOfWork在我的服務中沒有(按設計) - 我甚至不知道如何將實體拉出UoW並進行更新。
我在談論這個錯誤還是我忽略了一些簡單的東西?或者我在設計這個方面存在根本性缺陷?我有一種感覺,我可能會比應該做得更難。
在此先感謝。
你在哪裏插入新的Poco到版本庫中以及何時/何地調用SaveChanges?你在上面的代碼中創建的Poco直接進入垃圾收集,對象沒有任何反應。我認爲有一些重要的代碼片段不能理解問題。你能多加一點嗎? – Slauma 2011-03-19 13:02:48
是的,這只是我的一個疏忽(已經很晚了)。 :)它已被添加。 – 2011-03-19 14:46:48