【问题标题】:Entity Framework only saves some fieldsEntity Framework 只保存一些字段
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2011-07-14
    • 2020-03-12
    • 2020-03-07
    相关资源
    最近更新 更多