28

Ben [t] değişken adı MY_ENTITYbeklenmedik GetType() varlık giriş için neden

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

olacak ama gerçek ben belirleyebilir nasıl

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

var beklenen yapabilirim akım döküm MY_ENTITY türüne giriş? Eğer kolayca bir DbContext ortamında kullanabilecekleri böylece

+3

ObjectContext.GetObjectType(..) mü ne kadar hiyerarşi aksine temel sınıfını dönecektir bellek içi nesne üzerinde BaseType() call 'is' anahtar sözcüğünü kullanarak karşılaştır? – Silvermind

+0

evet, bu işe yarıyor. –

cevap

43

Sen Bu static method of ObjectContext olduğunu

ObjectContext.GetObjectType(entity.GetType()) 

tarafından bir proxy türü özgün varlık türünü alabilirsiniz.

bir nedenle orijinal türü olarak asıl varlık gerekiyorsa ikinci pasajı iki kez nesneyi atmalarını çünkü bu biraz daha verimli

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

daha deseni

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

kullanabilirsiniz .

+0

Orijinal türünü bilmenin çok iyi bir nedeni 'Equals()' işlevini geçersiz kılmaktır, çünkü standart olarak GetType() işlevi, altta yatan türle aynı olmayan proxy'yi döndürür. – nicodemus13

+0

Açıkça görülene kadar, yöntemin statik olduğunun açık bir şekilde ortaya çıktığı belliydi (açık olmalıydı)! – madannes

2

başka yolu da iade vekil Çeşidi BaseType özelliğine erişmektir:

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

Başlangıçta bu cevabı, yanıtı kabul edilen cevaptan daha iyi (ObjectContext'e gereksinim duymadan daha fazla kendi kendine) görüyorum. Ancak, senaryoya bağlı olarak potansiyel bir problem vardır. Bir varlık ekliyorsanız, henüz bir proxy türü değil, yalnızca bir POCO türü. Bu nedenle, BaseType çağrısı, 'object' döndürür.Yalnızca DB'den alınan varlıklarla uğraşmak gibi bir proxy türü ile çalışıyorsanız, sorun değil, ancak koleksiyonun kaydedilmemiş varlıkları gibi POCO veya proxy olması durumunda, ObjectConext kullanımı Enrico gibi tek güvenli seçenektir aşağıda açıklar. – Kate

5

Sen

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

veya

ObjectContext.GetObjectType(entity.GetType()) 

Ama second şekilde kullanabilirsiniz bir olduğunu Benim bakış açımdan daha iyi yol. Eğer örnek DTO mapper için (varlık nesneden DTO sınıfına veya hafıza in-DTO sınıfında itiraz itibaren) Tipi() Bir Mapper yöntemi içinde istek, dersek, ObjectContext.GetObjectType(..) size daima beklenen sonuç aykırı verecektir ne olacak .GetType().BaseType

Eğer EF varlık modeli için TPT (Table per Type) stratejisi kullanırsanız

Örneğin, sen çalıştı

enter image description here

İlgili konular