2012-03-07 3 views
0

У меня есть Entity Framework объектная модель с двумя объектами:Заменить объект модель свойства со значением из базы данных

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

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

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(); 
} 
+0

Хм, это определенно решит проблему, но мне нужно «Проверить» в «Alert» с самого начала. Созданный объект-объект - это объектная модель для мастера, которая может занять несколько минут. Только в конце я могу сохранить весь график. –

+0

@ RonaldWildenberg, то единственное, что я могу предложить, это то, что вы получите его в начале, если оно существует. – tvanfosson

+0

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

Смежные вопросы