在哪里用工作单元模式验证我的实体?

时间:2012-07-16 16:15:37

标签: .net asp.net-mvc entity-framework unit-of-work

我总是在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? ......无法保证验证已完成。

2 个答案:

答案 0 :(得分:0)

你基本上就在那里。当您使用UoW时,您的存储库更新将独立于对数据存储的任何提交。只需将您的DbContext.SaveChanges()移至新的UnitOfWork.Commit()方法(或直接使用DbContext.SaveChanges()作为提交方法),并将验证逻辑保留在您的存储库“Insert / {{ 1}}方法。

Update

答案 1 :(得分:0)

我更喜欢不混合验证和数据保存。当然,在保存到数据库之前,实体必须进行验证,但这并不意味着它们必须在 上进行验证。

根据应用程序的不同,可能需要在上下文之外进行验证,例如在单元测试中,在某些UI操作上,在ASP.NET MVC中进行远程/客户端验证等等,可能并非所有操作都必须导致提交数据。

也许最好验证所有受影响的实体而不是保存它?使用默认的内置ASP.NET MVC验证很容易,因为它使用与EF相同的属性。当然,如果您使用第三方验证框架,它会更容易。

备注:另外不要忘记,某些错误不能处理而不保存,通常是约束违规并触发逻辑。因此验证也必须处理错误。不幸的是我不知道EF如何处理这些错误,在我的开发中我通常会为每个约束做一些硬编码。