检索/更新ObjectContext中已存在的实体框架POCO对象

时间:2010-05-14 18:49:06

标签: entity-framework c#-4.0 poco

我有一个使用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时注入的代理对象有关。

之前是否有人遇到此问题?如果是这样,解决方案是什么?

1 个答案:

答案 0 :(得分:3)

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

我知道这是一个老问题,但我偶然发现了它,并且在一秒钟之前就读到了它。