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