2013-11-14 56 views
1

有沒有一種方法可以實現從模型中指定的實體類型派生的自己類的實例?假設我的模型中有一個「ClassName」屬性用於給定的實體,並且每當EF實現實體的一個實例時,我想創建一個指定ClassName的實例,而不是實體的子類(當然這是實體的子類) 。在Entity Framework中自定義實體實體化6

我知道ObjectContext上有ObjectMaterialized事件,但此時實體已經創建。

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.ObjectMaterialized += OnObjectMaterialized; 

我之前需要一個鉤子來定製對象創建。你可能會問,爲什麼我需要這樣做。我有一個不斷變化的大對象模型,所以我無法在EDMX中定義所有的類。我存儲在數據庫中的屬性可以抽象爲對象模型層次結構頂部的幾個類。我打算爲那些使用table-per-type繼承的實體創建實體。但是如果我能夠在使用EF時直接檢索特定的對象實例,那將非常棒。

謝謝!

+1

不是你的問題的答案,但生成的實體類是部分的。你不能簡單地將你需要的功能添加到這些部分類嗎? – oerkelens

+0

要添加到@oerkelens的評論,您還可以使用擴展類。在世代階段發生變化時,與這代人混淆可能會回來並咬你 – ESG

+0

通過部分類添加方法或屬性是不夠的。我需要在實體類下創建一個帶有繼承的完整對象模型。 –

回答

1

我想創建自定義代理並深入到實體框架中進行調試。我發現譯員類,它負責通過反射來創建實體。該類的命名空間爲System.Data.Entity.Core.Common.Internal.Materialization

創建實體的方法是私有方法Emit_ConstructEntity。實體類型是一個參數,由基於EdmType對象的私有方法LookupObjectMapping創建(我首先使用模型)。

如果您想要更改創建的類,則必須創建一個自定義MetaDataWorkspace。工作區負責選擇EdmType。也許嘗試自己調試方法,看看如何使用MetaDataWorkspace來識別CLR類型。

相關問題