【问题标题】:How to update both child and parent table in single transaction using entity framework? [duplicate]如何使用实体框架在单个事务中更新子表和父表? [复制]
【发布时间】:2014-02-13 20:52:43
【问题描述】:

您好,我在下面指定了一个代码,它目前正在将新行插入子表并更新父表。

var child= new Child();
child.Parent= parent;
DataContext.Parent.Add(parent); 
DataContext.Entry(parent).State = EntityState.Modified;

现在我希望在单个事务中更新父表和子表。如果有人可以帮助我,那将非常有帮助。

【问题讨论】:

  • 这个问题在这里得到解答:stackoverflow.com/questions/815586/…
  • 在执行上述 4 行之后,还执行以下行:DataContext.SaveChanges();我的问题是如何更新这两个表。

标签: c# entity-framework


【解决方案1】:

您将使用事务范围...

using (TransactionScope scope = new TransactionScope())
{
    var child= new Child();
    child.Parent= parent;
    DataContext.Parent.Add(parent); 
    DataContext.Entry(parent).State = EntityState.Modified;

    DataContext.SaveChanges();
    scope.Complete();
}

我看不到你在你的代码 sn-p 中更新你的数据上下文,但我希望会有更多这样的东西..

using (var context = new MyContext())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var child= new Child();
        child.Parent= parent;
        context.Parent.Add(parent); 
        context.Entry(parent).State = EntityState.Modified;

        context.SaveChanges();
        scope.Complete();
    }
}

这样,当你完成后,上下文就会被释放。

EDIT - 因为您想更新父级而不是添加它。

您应该从数据库中检索父级而不是添加它并对父级进行更改,但是在您的代码中根本没有对父级进行任何更改,因此它当然不会对父级进行更新记录...如果已经存在,则不需要添加父项。

using (var context = new MyContext())
{
    using (TransactionScope scope = new TransactionScope())
    {
        var child= new Child();
        var parentRecord = context.Parent.Find(parent.Id);
        child.Parent= parentRecord; 

        context.SaveChanges();
        scope.Complete();
    }
}

【讨论】:

  • 如果不应用“使用上下文”,是否会插入子数据而不是更新?使用我的代码可以插入子详细信息并更新父详细信息。但我想要的是更新这两个表。
  • 编辑了我的答案...我不知道您添加的 sn-p 之前的代码是什么样的,但如果您正在检索父级,您是否真的对其进行了更改?如果父级已经存在并且从您显示的代码中,您不需要再次“添加”父级,您实际上并没有更改任何内容,那么 EF 为什么要进行更新?没有什么可更新的!
  • 实际上使用我的代码,我可以使用以下代码更新父表:DataContext.Entry(parent).State = EntityState.Modified; DataContext.SaveChanges();由于我将实体状态设为已修改,因此它正在更新数据。我在更新父表时没有任何问题,问题仅在于子表。我想更新它,但每次都用上面的代码插入它。
  • 您显然是在添加一个新孩子?当子级不存在时,实体框架如何更新它? ...我很抱歉,但你的问题不够清楚,我不确定你到底在尝试什么。如果您新建一个子对象,然后将其添加到父对象,它当然会添加一个新的子记录...
  • 你和你提到的完全一样。现在我正在添加它,我不知道如何更新孩子的详细信息。我想做你为 parent 提到的类似的事情: var parentRecord = context.Parent.Find(parent.Id);为此,我的子表将有单亲的多条记录。如果我很烦人,我真的很抱歉,我对这个 EF 很陌生,所以只是问了这么多疑问。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多