我有一个EF Code First数据库,在我在数据库中创建实体之前,我先检查相关实体是否存在,关联它,然后创建实体。
例如,假设我有一个具有相关用户实体的Order实体。如果Order实体想要存储在数据库中,我首先检查用户是否已经存在。如果是,我想更改订单,以便它的用户属性等于现有的用户实体,而不是创建新记录。
// check for an existing user and associate them instead of creating a new one
var existingUser = await _userRepository.GetAsync(u => u.Username == order.User.Username);
if (existingUser != null)
{
order.User = existingUser;
Context.Entry(order.User).State = EntityState.Modified;
}
上面代码中的以下行导致了问题:
order.User = existingUser;
在该行之前," Context.Users"有两条记录(正确)。但在该行之后,它包含三个记录(不正确),其中两个记录完全相同。
为什么代码不是简单地将 existingUser 对象分配给 order.User 属性而不是在Context中创建新记录?
答案 0 :(得分:0)
感谢GertArnold,我通过以下方式解决了这个问题:
替换:
order.User = existingUser;
Context.Entry(order.User).State = EntityState.Modified;
使用:
Context.Entry(order.User).CurrentValues.SetValues(existingUser);
参考: https://stackoverflow.com/a/14476027/1448448
这很可能是因为oldEntry和newEntry有 实体密钥的不同值。它有可能失败,因为 你不能改变现有实体的钥匙。