我尝试使用以下代码更新对象:
using (var context = new ApplicationEntities())
{
var entry = context.Entry(obj);
entry.State = EntityState.Modified;
context.SaveChanges();
}
但是,它通过抛出以下异常大部分时间都失败了。
更新条目时发生错误。看到内心 细节例外。 System.Data.Entity.Core.UpdateException:An 更新条目时发生错误。查看内部异常 细节。 ---> System.Data.SqlClient.SqlException:属性不能 添加。 'ForeignKeyName'已存在属性'MS_Description'。 声明已经终止。
这里,ForeignKeyName
是与其他表的外键关系的名称。
我的问题是为什么要为MS_Description
添加ForeignKeyName
属性。
我还尝试仅更新除外键之外的对象的选择属性。但是,它也失败并抛出类似的异常。这种情况发生在生产环境中,在本地开发环境中也没问题。
更新
我发现了主要问题。它既不与实体框架相关,也与应用程序无关。我发现更新此特定表的一行会触发一个触发器。触发器的定义非常错误,它试图为外键名称添加MS_Description。我删除了特定的声明,现在可以使用了。
答案 0 :(得分:0)
虽然不是EF,但可能的替代方案可能是使用Drapper(Dapper的抽象层)。
使用Drapper,您可以提供SQL语句来更新记录,从而完全控制执行。
您的更新方法可能类似于
public Model Update(Model model)
{
return _commander.Execute(model) ? model : null;
}
_commander
是Drapper IDbCommander
的一个实例。这是您为EF编写的代码的一半,具有更多,更多的控制权。
你应该检查一下。