2013-07-21 70 views
0

我搜索了在EF 4中使用的onObjectMaterialized,以便在實體實體化後儘快運行代碼。但只找到3個答案,沒有真正的幫助。實體框架5 onObjectMaterialized缺失?

在EF4中,我記得編輯VS.NET EF模板,然後更新VS.NET以使用那些可以使ObjectContext啓用支持的新模板。

但是對於EF 5,我現在有了一個DBContext並且似乎無法找出如何做同樣的事情。

非常感謝您的幫助。

+1

你想要做什麼?也許有更好的方法去做你想做的事情?你是否嘗試初始化對象? –

+0

我有一個「打包的字段」,我需要解壓縮。我無法控制數據庫或結構。有了EF5,我必須實體化實體,然後調用解壓縮方法。另一種方法是在所有需要解包的情況下添加一個支票 - 但這是很多重複的代碼。 – JustMeToo

+1

您始終可以使用對象上下文適配器。像這樣的'((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized + = this.ObjectContext_OnObjectMaterialized;' –

回答

0

更好的解決方案是消除整個edmx事物並使用反向代碼優先方法。這最終效率更高,我不必在edmx中用xml玩遊戲。

1

感謝Mystere Man,我有一個答案。這比我想象的要容易得多。

其他可能有不同的方法,但關鍵信息是相同的。

爲您的上下文創建部分類。這不是必需的,但它有助於將代碼與生成的代碼隔離。

在解決方案下的xxxModel.edmx應該是4個單獨的文件。打開以.tt結尾的那個。這是模板。

在模板中,在模板代碼之後添加對方法的調用以創建構造函數。模板代碼應類似於此:現在

<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext 
    { 
     public <#=code.Escape(container)#>() 
      : base("name=<#=container.Name#>") 
     { 
      // Put your method call here 
      MyConstructor(); 

,在局部類(或模板,如果你不使用局部類),定義方法,並從空軍終於滿添加代碼。

protected void MyConstructor() 
    { 
     ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += this.ObjectContext_OnObjectMaterialized; 
    } 

然後你只需要添加你的方法來火了:

public void ObjectContext_OnObjectMaterialized(Object sender, ObjectMaterializedEventArgs e) 
    { 
     if (e.Entity is IMyEntityClass) ..... 

或任何你想有當實體materialzed發生。就我而言,我只是檢查,如果實體是保存填充字段的類型,如果是這樣,調用的代碼把它解壓(這是一個分部類的實體。)

享受