28

雖然我通過ObjectStateEntries迭代我預計[t]變量名稱將是MY_ENTITY意想不到的GetType()導致對實體進入

foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted)) 
{ 
    Type t = entry.Entity.GetType(); 
    ... 
} 

,但真正的我有

System.Data.Entity.DynamicProxies.MY_ENTITY_vgfg7s7wyd7c7vgvgv..... 

如何確定我可以施展電流輸入MY_ENTITY類型?

+3

是否嘗試過使用'is'關鍵字進行比較? – Silvermind

+0

是的,這個工程。 –

回答

43

您可以通過

ObjectContext.GetObjectType(entity.GetType()) 

得到一個代理類型的原始實體型這是一種static method of ObjectContext,所以你可以很容易地在一個DbContext環境中使用。

如果由於某種原因,你需要實際的實體作爲其原始類型,你可以使用該模式

var entity = entry.Entity as MyEntity; 
if (entity != null) 
{ 
    ... 
} 

這比

if (entry.Entity is MyEntity) 
{ 
    var entity = (MyEntity)entry.Entity; 
    ... 
} 

會更有效,因爲後者片斷鑄對象兩次。

+0

需要知道原始類型的一個很好的理由是重寫'Equals()',因爲標準的'GetType()'返回代理,它與底層類型不一樣。 – nicodemus13

+0

(應該是)這個方法是靜態的這個顯而易見的事實在我指出來之前完全失去了! – madannes

2

另一種方式是訪問返回的代理類型的BaseType屬性:

Type t = entry.Entity.GetType().BaseType; 
+6

我最初與這個答案一起,因爲它看起來整潔(比需要ObjectContext更多的自我包含)比接受的答案。但是,根據場景,存在潛在的問題。如果你添加一個實體,它不是代理類型,而只是一個POCO類型。因此,調用它的BaseType返回'object'。如果您只使用代理類型,比如它只是處理從數據庫檢索到的實體,那麼沒有問題,但如果它可以是POCO或代理(例如,如果集合具有未保存的實體),則使用ObjectConext是唯一安全的選項,因爲Enrico下面解釋。 – Kate

5

您可以使用

Type t = entry.Entity.GetType().BaseType; 

ObjectContext.GetObjectType(entity.GetType()) 

second方式是從我的角度來看,更好的方式是。如果您在Mapper方法中調用Type()請求,例如DTO映射器(從實體對象到DTO類或從內存對象到DTO類),ObjectContext.GetObjectType(..)將授予您總是預期結果與.GetType().BaseType

相反

例如,如果您使用的是TPT (Table per Type)策略EF實體模型,調用BASETYPE()在內存中的對象將在層次結構相反返回基類你會ObjectContext.GetObjectType(..)

enter image description here

相關問題