将对象插入EF 6两次

时间:2016-03-09 20:33:44

标签: c# sql-server asp.net-mvc entity-framework

如何在具有不同值的数据库中插入对象两次 当对象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

2 个答案:

答案 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的开发人员的责任。)