2013-02-08 84 views
3

人,實體框架:context.AddObject不添加主人

我在創建擁有主人的新對象時遇到問題。問題實際上是EF正在嘗試創建主對象,但我不需要它。

我的兩個POCO類的樣子:Application類的

[DataContract(IsReference = true)] 
public class Application 
{ 
    [DataMember] 
    public int ID { get; set; } 

    [DataMemeber] 
    public int ProjectManagerId {get; set; } 

    [DataMember] 
    public ProjectManager PM { get; set;} 
} 

[DataContract(IsReference = true)] 
public class ProjectManager 
{ 
    [DataMember] 
    public int ID { get; set; } 

    [DataMember] 
    public string FullName { get; set; } 

} 

當我創建ASP.NET MVC頁上的新對象,我已經有了對象,有ProjectManagerId等於1和PM場ID = 0,FullName例如'Forest Gump'。

所以,當我加入的對象,我有異常application.PM.ID不能爲0:

context.Applications.AddObject(application); 
context.SaveChanges(); 

是否有可能ADDOBJECT我的對象不增加主?

我找到了解決辦法,但我不喜歡它:它是分配PM字段中添加對象上下文

之前空
application.PM = null; 

回答

4

EF有您必須知道的一個核心原則。它適用於整個對象圖,它不允許在同一對象圖中組合分離和附加的實體。這意味着AttachAddObject方法將始終在對象圖中的所有實體上執行(它將遍歷導航屬性並遞歸執行操作)。

由於這種基本行爲,您必須手動處理現有對象。您有三種選擇:

請勿使用導航屬性。你的Application類有ProjectManagerId暴露。您只需將此屬性設置爲現有管理器的ID而不填充ProjectManager導航屬性以構建關係。

var application = new Application { ProjectManagerId = 1 }; 
context.Applications.AddObject(application); 
context.SaveChanges(); 

附上你的父母,添加子後,才使它們之間的連接:

最後一個選項是簡單地固定現有實體的狀態。在這種情況下,您將設置項目管理器不變,同時應用程序仍將保持添加狀態:

// Add application and its related project manager 
context.Applications.AddObject(application); 
context.ObjectStateManager.ChangeObjectState(application.ProjectManager, EntityState.Unchanged); 
context.SaveChanges(); 
+0

感謝您的回答,這非常有幫助 – DanTheMan