Я пытаюсь создать метод в репозитории 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();
}
@Craig: Поэтому, если я загружаю родительский элемент POCO, у которого есть дети (и, возможно, внуки и т. Д.) Через EF 4, измените некоторые дочерние объекты (измените существующие, добавьте новые, удалите некоторые), мне нужно вручную обновить граф объектов в ObjectContext? –
№ Если вы загружаете из контекста, и сущности выполняют некоторую форму отслеживания изменений, это автоматически. Это только при копировании с отключенного объекта, который вы сами по себе. –
@Craig: Я загрузил из контекста изначально, но обнаружил, что мои изменения не применялись при вызове SaveChanges(). Какое отслеживание изменений требуется для объекта POCO? И если он должен реализовать механизм отслеживания изменений, действительно ли он является объектом POCO? –