Как сохранить свойство NavigationProperty в объекте из другого контекста?

49
3

У меня есть две таблицы базы данных: одна для событий и одна для RecurrenceRules. События имеют FK, который указывает на RecurrenceRuleID.

Все, что я хочу сделать, это сохранить событие и правило повторения из нового контекста, но я не могу этого сделать. Что мне не хватает?

using (var context = new ScheduledEventEntities())
{
if (obj.EntityKey == null)
{
context.AddObject(obj.EntityKey.EntitySetName, obj);
}
else
{
var existingObject = context.Events.FirstOrDefault(p => p.Ident == obj.Ident);
context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj);

// How do I save obj.RecurrenceRule?
}

context.SaveChanges();
}

спросил(а) 2011-09-20T23:01:00+04:00 8 лет, 5 месяцев назад
1
Решение
61

Я бы попробовал это так:

// ...
var existingObject = context.Events.Include("RecurrenceRule")
.FirstOrDefault(p => p.Ident == obj.Ident);
context.ApplyCurrentValues<Event>(obj.EntityKey.EntitySetName, obj);

// 1st case: Relationship to RecurrenceRule has been removed or didn't exist
if (obj.RecurrenceRule == null)
existingObject.RecurrenceRule = null;
// 2nd case: Relationship to RecurrenceRule must be set or updated
else
{
// relationship has changed
if (existingObject.RecurrenceRule == null ||
obj.RecurrenceRule.Id != existingObject.RecurrenceRule.Id)
{
var existingRecurrenceRule = context.RecurrenceRule
.SingleOrDefault(r => r.Id == obj.RecurrenceRule.Id);
if (existingRecurrenceRule != null) // RecurrenceRule exists in DB
{
// Update scalar values
context.ApplyCurrentValues<RecurrenceRule>(
obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule);
}
else // RecurrenceRule does not exist in DB
{
// nothing to do, SaveChanges will recognize new RecurrenceRule
// and create INSERT statement
}
// set new relationship
existingObject.RecurrenceRule = obj.RecurrenceRule;
}
else // same relationship: just update scalar values
{
// Update scalar values
context.ApplyCurrentValues<RecurrenceRule>(
obj.RecurrenceRule.EntityKey.EntitySetName, obj.RecurrenceRule);
}
}

// ...

Проблема в том, что ApplyCurrentValues заботится только об обновлении скалярных свойств, но не о свойствах навигации, поэтому вам придется самостоятельно обрабатывать свойства навигации. (К сожалению, обновление отдельных графиков объектов ведет почти всегда к такому утомительному коду, потому что в Entity Framework нет встроенного механизма для выполнения этой работы.)

ответил(а) 2011-09-21T00:07:00+04:00 8 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема