即使设置了有效数据,实体框架也会在 saveChanges 时抱怨必填字段

Eti*_*gné 5 postgresql asp.net-mvc entity-framework devart

我将实体框架(首先是数据库的 DbContext)与 MVC 结合使用。当用户从表单保存时,我在控制器中有一个条件,根据我的一些内部标志将实体发送到插入方法的更新。

当将实体发送到 update 方法时,我将其标记为使用 进行修改context.Entry(myEntity).State = EntityState.Modified;,我调用 saveChanges() 并且一切正常。

将实体发送到插入方法时,我将其标记为使用添加,context.Entry(myEntity).State = EntityState.Added;但在调用 saveChanges() 时,我收到有关 2 个必需字段的错误...

问题是,这两个字段不为空,并且它们在保存之前有效地包含有效数据...我什至尝试在保存之前强制将新值添加到这两个字段,但出现同样的错误。

提到我正在使用 Devart DotConnect For PostgreSQL 作为数据库提供程序可能会很有用。

知道如何调试这个问题吗?

编辑:

这是错误:

一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。

在查找此 EntityValidationErrors 时,我收到以下 2 个特定错误:

flg_actif 字段是必需的

user_creation 字段是必需的

如前所述,这些字段在保存之前填充了数据,所以我不明白发生了什么。

我正在使用 EF v4.0.30319 (system.data.entity=> v4.0 和 EntityFramework=> v4.4)

EDIT2: 只是为了澄清一点:我尝试插入的实体已存在于数据库中。该表格显示该数据库行的数据。保存时,我决定是否更新该行(这很好用),但有时,我需要将编辑的行作为新寄存器插入,而不是更新它以保留数据库中更改的历史记录。

Nic*_*ick 2

您能否验证您尝试保存的项目的 EntityKey 属性是否已设置或为 null?

如果它已经有一个键,则上下文已经知道该项目,并且您应该使用 Attach 而不是将状态设置为手动添加。

编辑:总结下面的观点。看起来您正在做的是插入已与上下文关联的行的新副本。这几乎肯定是你的问题。尝试根据原始行创建一个新对象(即复制变量值或使用复制构造函数),然后添加该新对象。

此外,您不需要在新添加的对象上手动设置状态。您试图在此处强制设置状态,因为上下文不会将该项目视为新项目。