У меня есть проект, использующий 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.
Кто-нибудь сталкивался с этой проблемой раньше? Если да, то каково было решение?