2010-05-14 77 views
4

存在我使用实体框架4.0波苏斯(数据存储在SQL数据库,惰性加载启用)如下项目:检索/更新实体框架POCO对象已经在ObjectContext中

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,并返回带有空的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覆盖,调用ObjectContext.Refresh()和ObjectContext.DetectChanges()无济于事......我怀疑这是关系到代理对象是EF波苏斯与工作时注入。

有没有人遇到过这个问题?如果是这样,那么解决方案是什么?

回答

3

你不应该使用“新”来创建一个新的实体,而是使用ObjectContext.CreateObject()。这样你的对象的代理将被实例化,而不是实体POCO类本身。

我知道这是一个古老的问题,但是我偶然发现并且刚刚读了一下。