Получение / обновление объектов POCO Entity Framework, которые уже существуют в ObjectContext - PullRequest
4 голосов
/ 14 мая 2010

У меня есть проект, использующий Entity Framework 4.0 с POCO (данные хранятся в БД SQL, включена отложенная загрузка) следующим образом:

public class ParentObject {
    public int ID {get; set;}
    public virtual List<ChildObject> children {get; set;}
}

public class ChildObject {
    public int ID {get; set;}
    public int ChildRoleID {get; set;}
    public int ParentID {get; set;}
    public virtual ParentObject Parent {get; set;}
    public virtual ChildRoleObject ChildRole {get; set;}
}

public class ChildRoleObject {
    public int ID {get; set;}
    public string Name {get; set;}
    public virtual List<ChildObject> children {get; set;}
}

Я хочу создать новый ChildObject, назначить ему роль, а затем добавить его в существующий ParentObject. После этого я хочу отправить новый объект ChildObject вызывающей стороне.

Приведенный ниже код работает нормально, пока не попытается вернуть объект из базы данных. В newChildObjectInstance установлен только ChildRoleID и он не содержит ссылку на фактический объект ChildRole. Я пытаюсь вытащить новый экземпляр обратно из базы данных, чтобы заполнить свойство ChildRole. К сожалению, в этом случае вместо создания нового экземпляра ChildObject и его присвоения retreivedChildObject EF находит существующий ChildObject в контексте и возвращает экземпляр в памяти с нулевым свойством ChildRole.

public ChildObject CreateNewChild(int id, int roleID) {
    SomeObjectContext myRepository = new SomeObjectContext();        

    ParentObject parentObjectInstance = myRepository.GetParentObject(id);

    ChildObject newChildObjectInstance = new ChildObject() {
        ParentObject = parentObjectInstance,
        ParentID = parentObjectInstance.ID,
        ChildRoleID = roleID
    };

    parentObjectInstance.children.Add(newChildObjectInstance);
    myRepository.Save();

    ChildObject retreivedChildObject = myRepository.GetChildObject(newChildObjectInstance.ID);

    string assignedRoleName = retreivedChildObject.ChildRole.Name; //Throws exception, ChildRole is null

    return retreivedChildObject;
} 

Я попытался установить для MergeOptions значение Overwrite, вызвав ObjectContext.Refresh () и ObjectContext.DetectChanges () безрезультатно ... Я подозреваю, что это связано с прокси-объектами, которые EF вставляет при работе с POCO.

Кто-нибудь сталкивался с этой проблемой раньше? Если да, то каково было решение?

1 Ответ

3 голосов
/ 23 сентября 2010

Вы не должны использовать «new» для создания новой сущности, вместо этого используйте ObjectContext.CreateObject () . Таким образом, будет создан экземпляр вашего объекта вместо самого класса сущности POCO.

Я знаю, что это старый вопрос, но я наткнулся на него и только что прочитал об этом секунду назад.

...