如何在具有不同值的数据库中插入对象两次
当对象User
具有Code > 10
时,它会插入2个对象,但有些EF会更新第一个插入对象的值。
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Code { get; set; }
}
在我的行动中,我正在保存到数据库
// Post Action
uow.Users.Add(user);
uow.Commit(); // save first time
if (user.Code > 10)
{
user.Name = "NAS";
uow.Users.Add(user);
uow.Commit(); //save second time
}
我的目标是
User = (Name = "Mike",Code=12)
数据库结果
Result Database
id =1 Name="NAS" Code=12
id =2 Name="NAS" Code=12
答案 0 :(得分:3)
这是正确的行为;那么为什么会这样呢:
user
对象在数据库中创建一个新条目。您的代码应为:
var user = new User { Name = "Mike", Code = 12 };
uow.Users.Add(user);
uow.Commit(); // save first time
if (user.Code > 10)
{
var newUser = new User { Name = "NAS", Code = user.Code };
uow.Users.Add(newUser);
uow.Commit(); //save second time
}
您的结果应该是:
Result Database
id = 1 Name = "Mike" Code = 12
id = 2 Name = "NAS" Code = 12
答案 1 :(得分:1)
drneel很好地explanation说明了为什么你的代码无法按预期工作。
现在可能有一个解决方法可以实现您想要实现的目标:在单个实例的DB中插入两个不同的实体。将其从上下文中分离出来,更改需要更改的内容,然后重新添加。
如果您的uow
继承自DbContext
,则会是:
var user = new User { Name = "Mike", Code = 12 };
uow.Users.Add(user);
uow.Commit(); // save first time
if (user.Code > 10)
{
uow.Entry(user).State = EntityState.Detached;
user.Id = 0;
user.Name = "NAS";
uow.Users.Add(user);
uow.Commit(); //save second time
}
我对在EF中分离实体的方式感到不舒服。在首次“保存”之后更换处理uow
并使用另一个进行第二次“保存”可能会更好。
主要风险涉及导航属性。分离不会结束对可能包含对您的用户实例的引用的其他实体的集合的跟踪。重新添加它可能会影响EF导航属性簿记。 (我不担心NHibernate,这样的簿记不由NH处理。它仍然是NH的开发人员的责任。)