【发布时间】: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