【问题标题】:No Exception thrown on SaveChanges() for invalid entities using N-Tier Entity Framework使用 N 层实体框架的无效实体在 SaveChanges() 上没有抛出异常
【发布时间】:2014-07-08 19:42:36
【问题描述】:

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

作为一种解决方法,我在调用 SaveChanges()(客户端验证)之前检查 InValid 实体,并且仅在所有实体都有效时才调用 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()的流程吗?有没有办法设置那个参数值?

@ChristofSenn 你有什么建议吗?

【问题讨论】:

  • 你能告诉我们映射到数据库的代码吗?看来,您的实体在 savechanges 上设置了 id 并且不使用您之前设置的 id。
  • Ehh...SaveChanges 确实会引发验证错误,除非您禁用它。但我有一种感觉,你做的比你表现出来的要多得多。例如,一个实体如何拥有这个 ChangeTracker 或一个属性 IsValid?为什么会有这种双重演员?这个 ObjectState 是什么?看起来您正在使用与 EF 的默认行为作斗争的框架。
  • 我使用的框架是ntieref.codeplex.com,是的,它的行为与默认的 EF 不同。下面的答案证实了这种行为是当前的缺点,所以我等待解决方案。
  • 不是一个不重要的细节...下次马上提这个。

标签: c# entity-framework validation n-tier-architecture savechanges


【解决方案1】:

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

【讨论】:

  • 好的,我已根据您的要求将其发布在项目网站上。
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 2012-12-17
相关资源
最近更新 更多