Validation 在EntityFramework4中执行验证是否有比覆盖SavingChanges更好的方法?

Validation 在EntityFramework4中执行验证是否有比覆盖SavingChanges更好的方法?,validation,entity-framework-4,Validation,Entity Framework 4,我觉得在您的上下文(即数据层)中进行验证有点不对。对于数据层来说,依赖验证似乎有点倒退。对我来说,在业务逻辑中进行验证更有意义,一旦验证完成,就可以保留更改。数据层应该能够依赖于数据是有效的这一事实 我不喜欢覆盖SavingChanges的第二个原因是它看起来非常混乱,而且很快就会充满代码。当你有一个复杂的对象图时,这个方法很快就会变得非常混乱 if (entity is MyType) { //perform MyType validation } 我不喜欢这个的第三个原因是我必须在

我觉得在您的上下文(即数据层)中进行验证有点不对。对于数据层来说,依赖验证似乎有点倒退。对我来说,在业务逻辑中进行验证更有意义,一旦验证完成,就可以保留更改。数据层应该能够依赖于数据是有效的这一事实

我不喜欢覆盖SavingChanges的第二个原因是它看起来非常混乱,而且很快就会充满代码。当你有一个复杂的对象图时,这个方法很快就会变得非常混乱

if (entity is MyType)
{
    //perform MyType validation
}
我不喜欢这个的第三个原因是我必须在对象上下文的构造函数中传递所有额外的验证器对象。我正在使用DI框架,但它仍然感觉混乱

我想我之所以会有这个问题,是因为我让人们使用存储库。我可以添加一个间接层,然后他们必须使用某种DTO。这里的缺点是似乎有很多额外的工作。还有必须进行的常量映射


您是否可以访问存储库并进行验证,而无需将所有内容都放在一个SavingChanges方法中?

如果您的代码很难看,请编写更好的代码:

var entities = context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
                                         .Select(ose => ose.Entity);
var errors   = entities.OfType<IMyValidationInterface>()
                       .SelectMany(e => e.Validate());

…完成了

这与我所拥有的非常相似:只是我没有在每个单独的实体中进行验证。感觉它违反了SRP。你可以随心所欲地做——使用外部验证器并不难。关键是,如果它需要超过两行代码,那么,它不应该。