web-dev-qa-db-ja.com

エンティティエントリの予期しないGetType()結果

ObjectStateEntriesを繰り返し処理している間、[t]変数名はMY_ENTITYになると予想していました

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

しかし、私は本当です

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

現在のエントリをMY_ENTITYタイプにキャストできるかどうかをどのように判断できますか?

33
Anton Putov

プロキシタイプの元のエンティティタイプを取得するには

ObjectContext.GetObjectType(entity.GetType())

これは ObjectContext の静的メソッドであるため、DbContext環境ですぐに使用できます。

何らかの理由で実際のエンティティを元のタイプとして必要とする場合は、パターンを使用できます

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

これは少し効率的です

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

後者のスニペットはオブジェクトを2回キャストするためです。

53
Gert Arnold

使用できます

_Type t = entry.Entity.GetType().BaseType;
_

または

_ObjectContext.GetObjectType(entity.GetType())
_

しかし、secondウェイは、私の観点からbetterウェイです。 Mapperメソッド内でType()リクエストを呼び出す場合、たとえばDTOマッパー(エンティティオブジェクトからDTOクラスへ、またはメモリ内オブジェクトからDTOクラスへ)の場合、ObjectContext.GetObjectType(..)always何に反する期待される結果.GetType().BaseType

たとえば、EFエンティティモデルに TPT(Table per Type) 戦略を使用する場合、メモリ内オブジェクトでBaseType()を呼び出すと、ObjectContext.GetObjectType(..)

enter image description here

8
Enrico Tirotta

別の方法は、返されたプロキシタイプのBaseTypeプロパティにアクセスすることです。

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