实体框架更新失败并抛出添加MS_Description属性的异常
本文关键字:MS Description 属性 异常 添加 更新 框架 失败 实体 | 更新日期: 2023-09-27 18:05:16
我尝试使用以下代码更新对象:
using (var context = new ApplicationEntities())
{
var entry = context.Entry(obj);
entry.State = EntityState.Modified;
context.SaveChanges();
}
但是,大多数情况下它会抛出以下异常而失败。
更新表项时出错。看清内心详细信息例外。System.Data.Entity.Core.UpdateException:一个更新条目时发生错误。参见内部异常细节。--> System.Data.SqlClient.SqlException: Property cannot be补充道。属性"MS_Description"已经为"ForeignKeyName"存在。语句已被终止。
这里,ForeignKeyName
是与其他表的外键关系的名称。
我的问题是为什么它试图为ForeignKeyName
添加MS_Description
属性。
我还尝试只更新对象的选择属性,除了外键。但是,它也会失败并抛出类似的异常。这种情况发生在生产环境中,在本地开发环境中没有问题。
更新:
我发现了主要问题。它既与实体框架无关,也与应用程序无关。我发现更新这个特定表的一行会触发一个触发器。触发器的定义非常错误,它试图为外键名添加MS_Description。我删除了特定的语句,现在它可以工作了。
虽然不是EF,但一个可能的替代方案可能是使用Drapper (Dapper的抽象层)。
使用Drapper,您将提供SQL语句来更新记录,从而完全控制执行。
你的更新方法可能看起来像
public Model Update(Model model)
{
return _commander.Execute(model) ? model : null;
}
其中_commander
是Drapper的IDbCommander
的实例。这是您为EF编写的代码的一半,并且具有更多的控制。
你应该去看看。