更新与另一个表对象(NxN)相关的实体对象(插入,删除)

时间:2018-08-30 10:52:19

标签: c# asp.net entity-framework entity-framework-6 entity

使用具有NxN关系的表的实体(到另一个表),我无法更新第一个表对象(内部有第二个表),因为程序显示了与第二个表相关的异常消息,并且说在第二个表中有一个记录具有相同的PK(但是我本身不是在更新第二个表,而是在更新NxN表,这意味着两个表之间的关系)。

这是场景:

表1-EntityObject1

Attribute1 int

Attribute2 字符串

Attribute3 字符串

Attribute4 列表(EntityObject2)

表2-EntityObject2

Attribute1 int

Attribute2 字符串


所以:

var previous = context.TABLE1.Include(path => path.TABLE2)
      .Where(p => p.Attribute1 == updateElement.Attribute1).FirstOrDefault();
previous.Attribute4 = updateElement.Attribute4;
context.SaveChanges();

不按我说的那样工作。

尝试的另一种方法是:

  

第一-从上下文中删除上一个,然后保存上下文。

     

第二-添加updateElement和Save上下文(不考虑PK更改的事实)

有没有简单的方法来实现这一目标?

完全迷路了...谢谢队友。

1 个答案:

答案 0 :(得分:0)

好吧,终于找到它了。我发布了至少可以通过以下方式帮助他人实现此目标的想法:

注意:我们必须使用事务处理一步来完成操作。

用于插入

我通常生成对象-表1,并为属性4生成对象列表-表2(首先附加),然后将列表分配给属性4 ...

(using context = new Dbcontext())
{
  using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
  {
    Table1 object1 = new Table1
    {
      Attribute1 = 1, //(autoincrement really)
      Attribute2 = "random value",
      Attribute3 = "random value",
    };

    foreach (Table2 obj2 in NewValues)
    {
      Table2 o = new Table2() {Attribute1 = obj2.int, Attribute2 = obj2.string};
      context.Table2.Attach(o);
      object1.Attribute4.Add(o);
    }
  }
}

用于更新

我只是擦除,以便以后插入。


另一种插入方式:

在临时列表中存储列表 将不带Attribute4的Object1添加到上下文中。 最后,将临时列表添加到object1.Attribute4。

(using context = new Dbcontext())
{
  using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
  {
    Table1 object1 = new Table1
    {
      Attribute1 = 1, //(autoincrement really)
      Attribute2 = "random value",
      Attribute3 = "random value",
    };

    List<Table2> tempTable2 = new List<Object2>();
    foreach (Table2 obj2 in NewValues)
    {
      Table2 o = new Table2() {Attribute1 = obj2.int, Attribute2 = obj2.string};
      tempTable2.Add(o);
    }

    context.Table1.Add(object1);
    context.SavesChanges();

    Table1 object11 = context.Table1.First(o => o.Attribute1 == object1.Attribute1);
    object11.Attribute4 = tempTable2
    context.SavesChanges();
  }
}