我有一个使用Entity Framework 4.0和POCO的项目(数据存储在SQL DB中,启用了延迟加载),如下所示:
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属性。不幸的是,在这种情况下,EF不是创建ChildObject的新实例并将其分配给retreivedChildObject,而是在上下文中查找现有的ChildObject,并返回具有null 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时注入的代理对象有关。
之前是否有人遇到此问题?如果是这样,解决方案是什么?
答案 0 :(得分:3)
您不应使用“new”来创建新实体,而应使用ObjectContext.CreateObject()。这样,您的对象的代理将被实例化,而不是实体POCO类本身。
我知道这是一个老问题,但我偶然发现了它,并且在一秒钟之前就读到了它。