Entity Framework 只保存部分字段

Entity Framework only saves some fields

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

在方法中,我从 GridView 中获取给定数据键的项目:

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 文件中的 table 时,ModifiedDate 字段在 StoreGeneratedPattern 中具有 "Computed"。但是,这应该只是最初计算的。例如,用户插入一个没有 ModifiedDate 的项目,SQL 服务器在创建时将 getdate() 放入字段中。

USE [MyDB]
GO

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

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