2010-05-14 75 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類本身。

我知道這是一個古老的問題,但是我偶然發現並且剛剛讀了一下。