Заменить свойство модели объекта значением из базы данных - PullRequest
0 голосов
/ 07 марта 2012

У меня есть объектная модель инфраструктуры сущностей с двумя сущностями:

Alert (1-*) ----- (1) Check

Таблица Check имеет уникальное ограничение для столбца UniqueProperty.

Чеки - это, как правило, уже существующие объекты в моей базе данных, и любое новое предупреждение должно быть добавлено к существующим проверкам.

Я создаю простой граф объектов где-то в моем коде:

var alert = new Alert();
alert.Check = new Check { UniqueProperty = someValue };

Некоторое время спустя я хотел бы сохранить свой граф объектов:

using (var context = new MyContext())
{
  context.Alerts.AddObject(alert);

  // Replace temp check with actual database check if available.
  var checkFromDb = context.Checks.SingleOrDefault(
      c => c.UniqueProperty = alert.Check.UniqueProperty);
  if (checkFromDb != null)
  {
    alert.Check = checkFromDb;
  }
  context.SaveChanges();
}

Итак, когда есть соответствующая проверка в базе данных, используйте ее, в противном случае ничего не делайте (и она будет просто добавлена).

Приведенный выше код вызывает уникальное нарушение ограничения для ограничения UniqueProperty. Причина в том, что EF запоминает первую проверку, хотя позже я заменяю ее проверкой из базы данных.

Как мне избавиться от этой первой проверки?

1 Ответ

1 голос
/ 07 марта 2012

Не настраивайте чек, пока не будете готовы сохранить.Если он уже существует, добавьте предупреждение в коллекцию предупреждений существующего чека.Если это не так, создайте новый, связанный с проверкой, затем добавьте предупреждение в базу данных.

var alert = new Alert();

...

using (var context = new MyContext())
{

  // Replace temp check with actual database check if available.
  var checkFromDb = context.Checks.SingleOrDefault(
      c => c.UniqueProperty = alert.Check.UniqueProperty);
  if (checkFromDb != null)
  {
    checkFromDb.Alerts.Add( alert );
  }
  else
  {
    alert.Check = new Check { UniqueProperty = some value };
    context.Alerts.AddObject(alert);
  }
  context.SaveChanges();
}
...