unexpected GetType() result for entity entry

前端 未结 3 1047
孤独总比滥情好
孤独总比滥情好 2020-12-05 06:41

While I iterating through ObjectStateEntries I expected [t] variable name will be MY_ENTITY

foreach (ObjectStateEntry          


        
相关标签:
3条回答
  • 2020-12-05 07:26

    You can use

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

    or

    ObjectContext.GetObjectType(entity.GetType())
    

    But the second way is a better way from my point of view. If you call Type() request inside a Mapper method, for example DTO mapper (from entity object to DTO class or from in-memory objects to DTO class), ObjectContext.GetObjectType(..) will grant you always the expected result contrary to what will .GetType().BaseType

    For example, if you use a TPT (Table per Type) strategy for EF Entity Model, call BaseType() on in-memory object will return the base class in hierarchy contrary to what will ObjectContext.GetObjectType(..)

    enter image description here

    0 讨论(0)
  • 2020-12-05 07:27

    You can get the original entity type of a proxy type by

    ObjectContext.GetObjectType(entity.GetType())
    

    This is a static method of ObjectContext, so you can readily use in in a DbContext environment.

    If for some reason you need the actual entity as its original type you can use the pattern

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

    This is slightly more efficient than

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

    because the latter snippet casts the object twice.

    0 讨论(0)
  • 2020-12-05 07:28

    Another way is to access the BaseType property of the returned proxy type:

    Type t = entry.Entity.GetType().BaseType;
    
    0 讨论(0)
提交回复
热议问题