【发布时间】:2019-07-11 22:31:03
【问题描述】:
我有一个使用实体框架提取数据的 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 文件中的表时,ModifiedDate 字段在 StoreGeneratedPattern 中已“计算”。但是,这应该只是最初计算的。例如,用户插入没有 ModifiedDate 的项目,SQL Server 在创建时将 getdate() 放入字段中。
USE [MyDB]
GO
ALTER TABLE [dbo].[MyEntities] ADD CONSTRAINT
DF_MyEntities_ModifiedDate] DEFAULT (getdate()) FOR [ModifiedDate]
GO
【问题讨论】:
-
“这应该是刚开始计算的” 然后将 StoreGeneratedPattern 更改为“Identity”。 “计算”是指由数据库在插入或更新时生成。
-
好的,但它的约束是 getdate() ,它与我的 ent.ModifiedDate = DateTime.Now 相同,那么为什么还要放回旧值呢?
-
因为 EF 忽略了您的值并从数据库中读取它。并且数据库确实不生成新值,因此您得到原始值。只有 EF 模型模式和数据库必须同步。虽然您显然不是 - 通过“计算”您告诉 EF 该值将由数据库生成,而实际上它不是。
标签: c# entity-framework savechanges