Как сохранить NavigationProperty для объекта из другого контекста? - PullRequest
1 голос
/ 21 сентября 2011

У меня есть две таблицы базы данных, одна для событий и одна для 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();
}

1 Ответ

2 голосов
/ 21 сентября 2011

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

// ...
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 нет встроенного механизма, который бы выполнял эту работу за вас.)

...