Обновление объекта сущности по отношению к другому объекту таблицы (NxN) (вставка, удаление) - PullRequest
0 голосов
/ 30 августа 2018

Используя сущность для таблицы с NxN-отношением (к другой таблице), я не могу обновить первый объект таблицы (с его второй таблицей внутри), потому что программа показывает сообщение об исключении, связанное со второй таблицей, и говорит: во второй таблице есть запись с тем же PK (но я не обновляю вторую таблицу как таковую, я обновляю NxN-таблицу, что означает отношения между двумя таблицами).

Это сценарий:

TABLE1 - EntityObject1

Атрибут1 int

Атрибут2 Строка

Атрибут3 Строка

Атрибут4 Список (EntityObject2)

TABLE2 - EntityObject2

Атрибут1 int

Атрибут2 Строка


Итак:

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 голосов
/ 04 сентября 2018

Ну, наконец-то найди это. Я публикую идею о том, чтобы помочь другим достичь ее, по крайней мере, так:

Примечание: мы должны использовать транзакцию для обработки операции за один шаг.

Для вставки

Я генерирую объект - Таблица 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);
    }
  }
}

Для обновления

Я просто стираю, чтобы вставить позже.


Другой способ вставки:

Список магазинов во временном списке Добавление Object1 без Attribute4 в контекст. Наконец, добавьте временный список к 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();
  }
}
...