我有一个带有字符串PK的EF实体,以及与之相关的其他实体
public class E1
{
public string PK {get;set;}
.....
}
在我的过程中,我为我的所有结构(E1和相关实体)分配了一个临时PK,等待用户确认文件。
如果用户确认,我指定一个definitelly PK,数据库更新所有ONCASCADE
我的问题是,当我试图改变E1的状态时,它会抛出此异常
物业' PK'是对象键信息的一部分,无法修改
如何避免此异常?
答案 0 :(得分:1)
这是一个老问题,但我想我会在那里抛出一个答案,因为我遇到了类似的问题,我不得不更新实体的主键值。我直接在数据库上执行了一个SQL命令来更新主键值,然后我处理并重新实例化了上下文。它运作得很好。这是一个代码示例:
if(theEntity.PKValue != newPkValue)
{
context.Database.ExecuteSqlCommand("UPDATE table SET PKValue = @p0 WHERE identifier = @p1", newPKValue, identifierValue);
context.Dispose();
context = new ContextName();
theEntity = context.tables.Single(e => e.identifier == identifierValue);
}
(由于您使用直接SQL更新主键,因此如果必须使用旧主键值作为标识符,则不应该有任何问题。但是,如果主键值是标识符,请记住搜索重置实体时 new 主键值。)