实体框架上下文自动创建新实体

时间:2017-06-29 22:04:27

标签: c# .net entity-framework

我有一个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中创建新记录?

1 个答案:

答案 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有   实体密钥的不同值。它有可能失败,因为   你不能改变现有实体的钥匙。