C# 使用N层实体框架的无效实体的SaveChanges()上没有引发异常

C# 使用N层实体框架的无效实体的SaveChanges()上没有引发异常,c#,entity-framework,validation,n-tier-architecture,savechanges,C#,Entity Framework,Validation,N Tier Architecture,Savechanges,在某些情况下,entity.IsValid为false,但SaveChanges()上没有引发异常。modelChangeSet只返回有效的实体(默认情况下),不会为无效的实体引发任何异常。因此,无效实体将以修改或添加的状态保留在datacontext中,并且不会捕获任何异常。例如,如果使用重复的主键创建新实体(DataContext.EntitySet.CreateNew()),则该实体无效,但调用SaveChanges()不会引发异常。调用SaveChanges()时,您能推荐一种获取验证错

在某些情况下,entity.IsValid为false,但SaveChanges()上没有引发异常。modelChangeSet只返回有效的实体(默认情况下),不会为无效的实体引发任何异常。因此,无效实体将以修改或添加的状态保留在datacontext中,并且不会捕获任何异常。例如,如果使用重复的主键创建新实体(DataContext.EntitySet.CreateNew()),则该实体无效,但调用SaveChanges()不会引发异常。调用SaveChanges()时,您能推荐一种获取验证错误消息的方法吗

作为一种解决方法,我在调用SaveChanges()之前检查无效的实体(客户端验证),并且只有在所有实体都有效时才调用SaveChanges()

foreach (Entity entity in context.EntitySet.Where(x =>   x.ChangeTracker.State.Equals(ObjectState.Added) || x.ChangeTracker.State.Equals(ObjectState.Modified)))
{
   if (!entity.IsValid)
   {
          MessageBox.Show(((System.ComponentModel.IDataErrorInfo)(NTier.Common.Domain.Model.Entity)entity).Error);
          invalidEntityFound = true;    
    }
}

If (!invalidEntityFound)
   Context.SaveChanges()
设置GetChangeSet()方法参数includeOnlyValid=false会改变SaveChanges()的流程吗?有没有办法设置该参数值


@Christofsen您有什么建议吗?

这是N层实体框架当前的一个缺点。请将此作为一个问题报告在上,我将对此进行跟进。

能否向我们展示映射到数据库的代码?看起来,您的实体在savechanges上设置了id,而不使用在它之前设置的id。Ehh<代码>保存更改会引发验证错误,除非您禁用了验证错误。但我有一种感觉,你所做的比你表现出来的要多得多。例如,实体如何具有此ChangeTracker或属性IsValid?为什么是双重演员?这个对象状态是什么?看起来你正在使用一个框架来对抗EF的默认行为。我正在使用的框架是,是的,它确实有不同于默认EF的行为。下面的答案证实了这种行为是当前的一个缺点,所以我等待解决方案。不是一个不重要的细节。。。下一次,请立即提及。好的,我已经根据您的要求将其发布在项目网站上。