为何无法通过Entity Framework修改Users表的CreatedOn字段?
解决Entity Framework无法修改CreatedOn字段的问题
这个问题我之前也碰到过,核心原因是CreatedOn字段的EF元数据设置和数据库端的自动生成逻辑双重限制导致的,咱们一步步来解决:
1. 修正EF模型的StoreGeneratedPattern设置
你已经找到了EDMX里的StoreGeneratedPattern="Computed"属性,但只改XML可能没同步到EF的模型元数据里。正确的操作应该是:
- 打开EDMX设计器界面,找到
Users实体的CreatedOn属性 - 按下F4调出属性窗口,把
StoreGeneratedPattern从Computed改成None - 保存EDMX文件,这会自动更新对应的实体类和EF的内部元数据
这个设置告诉EF:这个字段的值不是数据库自动计算生成的,允许应用程序主动修改并写入数据库。
2. 检查数据库端的自动生成逻辑
即使EF这边设置对了,数据库里的默认约束或触发器也可能在你更新时自动覆盖CreatedOn的值:
- 打开SQL Server Management Studio,找到
dbo.Users表 - 右键选择「设计」,查看
CreatedOn字段的默认值或绑定,如果有类似GETDATE()的设置,这是默认约束,会在插入时自动赋值,但通常不影响更新; - 右键选择「触发器」,检查是否存在UPDATE触发器,有些项目会写触发器在更新时强制重置
CreatedOn,如果有这类触发器,需要修改或删除它。
根据你的需求调整:
- 如果只需要插入时自动生成,后续允许修改:保留INSERT触发器(如果有的话),删除UPDATE触发器;
- 如果完全由应用程序控制:直接删除默认约束和所有相关触发器。
3. 验证修改效果
完成上述两步后,重新运行你的代码,查看EF生成的UPDATE语句,应该能看到CreatedOn字段被包含在SET子句中了,比如:
UPDATE [dbo].[Users] SET [CreatedOn] = @0, [CF20] = @1, ... WHERE ([ID] = @2)
应急方案:用原生SQL强制更新
如果暂时不想调整模型和数据库设置,也可以绕开EF的实体跟踪,直接执行原生SQL来修改:
using (var db = new MainDB()) { var targetUser = db.Users.Single(u => u.LoginName == model.User.LoginName); db.Database.ExecuteSqlCommand( "UPDATE dbo.Users SET CreatedOn = @0, CF20 = @1 WHERE ID = @2", new DateTime(2017, 1, 1), "test20", targetUser.ID); }
内容的提问来源于stack exchange,提问作者Edward Tanguay
相关产品推荐
相关产品推荐

