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

时间:2012-11-02 00:29:49

标签: asp.net-mvc entity-framework postgresql devart

我正在使用带有MVC的Entity Framework(带数据库的DbContext)。当用户从表单保存时,我在控制器中有一个条件,根据我的某个内部标志将实体发送到插入方法的更新

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

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

问题是2个字段不是空的并且它们在保存之前有效地包含有效数据...我甚至在保存之前尝试强制新值到2个字段但是同样的错误。

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

知道如何调试此问题吗?

编辑:

这是错误:

  

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

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

  

flg_actif字段是必需的

     

user_creation字段是必需的

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以验证EntityKey属性是否已设置,或者您要保存的项目是否为null?

如果它已经有一个键,上下文已经知道该项,你应该使用Attach而不是设置状态来手动添加。

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

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