我总是在DbContext.SaveChanges()
方法中看到UnitOfWork.Commit()
。但是当我从DbContext获取实体并更改属性时,UnitOfWork.Commit()
会将新实体值写回我的数据库而不进行任何验证。
我将避免使用集成的DbContext.Configuration.ValidateOnSaveEnabled = true;
。
目前我不使用UnitOfWork-Pattern。我在我的Service类中的每个Insert / Update操作上运行验证,如果验证成功,则Repository调用DbContext.SaveChanges()
。
如何避免使用无效实体的UnitOfWork.Commit()
?
如果我在ASP.NET MVC控制器中使用UnitOfWork对象,则在此答案中建议:
Where does Unit Of Work belong w/ EF4, IoC (Unity), and Repository?
......无法保证验证已完成。
答案 0 :(得分:0)
你基本上就在那里。当您使用UoW时,您的存储库更新将独立于对数据存储的任何提交。只需将您的DbContext.SaveChanges()
移至新的UnitOfWork.Commit()
方法(或直接使用DbContext.SaveChanges()
作为提交方法),并将验证逻辑保留在您的存储库“Insert
/ {{ 1}}方法。
Update
答案 1 :(得分:0)
我更喜欢不混合验证和数据保存。当然,在保存到数据库之前,实体必须进行验证,但这并不意味着它们必须在 上进行验证。
根据应用程序的不同,可能需要在上下文之外进行验证,例如在单元测试中,在某些UI操作上,在ASP.NET MVC中进行远程/客户端验证等等,可能并非所有操作都必须导致提交数据。
也许最好验证所有受影响的实体而不是保存它?使用默认的内置ASP.NET MVC验证很容易,因为它使用与EF相同的属性。当然,如果您使用第三方验证框架,它会更容易。
备注:另外不要忘记,某些错误不能处理而不保存,通常是约束违规并触发逻辑。因此验证也必须处理错误。不幸的是我不知道EF如何处理这些错误,在我的开发中我通常会为每个约束做一些硬编码。