实体框架仅保存一些字段

时间:2018-04-11 16:56:06

标签: c# entity-framework savechanges

我有一个使用Entity Framework提取数据的GridView。 RowUpdating事件给了我一个奇怪的问题。拉出所需数据,插入和删除工作正常,它只是更新。

在方法中,我从GridView获取给出datakey的项目:

int dataKey = Convert.ToInt32(gridView.DataKeys[e.RowIndex].Value);
MyEntity ent = context.MyEntities.First(x => x.Key == dataKey;

然后我更新必要的字段并保存:

ent.Field1 = "some data";
ent.Field2 = "other data";
ent.ModifiedDate = DateTime.Now;
context.SaveChanges();

在调试时,在context.SaveChanges()之后,我看到Field1和Field2保存了它们的新值,而ModifiedDate又改回了之前的状态。

我能想到的唯一可能导致这种情况的是,当我查看.edmx文件中的表时,ModifiedDate字段具有" Computed"在StoreGeneratedPattern中。但是,这应该是最初计算的。例如,用户插入没有ModifiedDate的项目,SQL Server在创建时将getdate()置于字段中。

USE [MyDB]
GO

ALTER TABLE [dbo].[MyEntities] ADD  CONSTRAINT
DF_MyEntities_ModifiedDate]  DEFAULT (getdate()) FOR [ModifiedDate]
GO

1 个答案:

答案 0 :(得分:0)

问题确实出在正在计算的StoreGeneratedPattern中。如果将其设置为“计算的”,它将覆盖用户将值设置为的任何值,并尝试在数据库中查找将为其提供计算值的约束。问题在于默认约束仅在未提供任何内容的情况下才会触发,但是为UPDATE命令生成的查询EF发送类似ModifiedDate = NULL的信息。因此,EF表示我将发送ModifiedDate = NULL,但是一旦数据库运行此更新查询,它将被覆盖。然后,数据库说好,如果用户不提供,我将为ModifiedDate提供一个计算值。哦,等等,我看到他们提供了我不需要运行约束的ModifiedDate。