我使用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