2010-06-08 3 views
1

Я пытаюсь создать метод в репозитории EF 4 POCO с именем AddOrUpdate.EF 4, POCO и AddOrUpdate

Идея состоит в том, что бизнес-уровень может проходить в объекте POCO, а структура persistence добавит объект, если он является новым (еще нет в базе данных), else обновит базу данных (после вызова SaveChanges()), с новым значением. Это похоже на некоторые другие вопросы, которые я задал об EF, но я понимаю только 80% понимания этого, поэтому, пожалуйста, простите частичное дублирование.

Часть, которую мне не хватает, заключается в том, как обновить граф объектов в объекте ObjectContext/related ObjectSet для объекта бизнес-объекта, когда я определил, что бизнес-объект действительно уже существует в базе данных (и теперь он загружен благодаря TryGetObjectByKey). ApplyCurrentValues ​​похоже на то, что я хочу, но он копирует только скалярные значения и, похоже, не предназначен для обновления графика объекта в ObjectContext/ObjectSet. Из-за моего конкретного использования я сейчас не забочусь о параллелизме.

public void AddOrUpdate(BO biz) 
{ 
    object obj; 

    EntityKey ek = Ctx.CreateEntityKey(mySetName, biz); 
    bool found = Ctx.TryGetObjectByKey(ek, out obj); 

    if (found) 
    { 
     // How do I do what this method name implies? Biz is a parent with children. 
     mySet.TellTheSetToUpdateThisObject(biz); 
    } 
    else 
    { 
     mySet.AddObject(biz); 
    } 

    Ctx.DetectChanges(); 
} 

ответ

0

Проблема заключалась в том, что мои бизнес-объекты использовали оператор new() для распределения дочерних объектов, а не для создания объекта из ObjectContext. Не действительно поведение POCO, если вы не можете использовать new(), но по крайней мере он работает после некоторого рефакторинга.

0

Для этого вам необходимо написать код. В нем нет ничего, что бы копировало весь граф. Как вы говорите, ApplyCurrentValues будет отлично работать для скалярных значений. Дети, которых вы должны будете скопировать.

+0

@Craig: Поэтому, если я загружаю родительский элемент POCO, у которого есть дети (и, возможно, внуки и т. Д.) Через EF 4, измените некоторые дочерние объекты (измените существующие, добавьте новые, удалите некоторые), мне нужно вручную обновить граф объектов в ObjectContext? –

+0

№ Если вы загружаете из контекста, и сущности выполняют некоторую форму отслеживания изменений, это автоматически. Это только при копировании с отключенного объекта, который вы сами по себе. –

+0

@Craig: Я загрузил из контекста изначально, но обнаружил, что мои изменения не применялись при вызове SaveChanges(). Какое отслеживание изменений требуется для объекта POCO? И если он должен реализовать механизм отслеживания изменений, действительно ли он является объектом POCO? –

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