Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you get a DbEntityEntry EntityKey object with unknown name

Shouldn't I be able to get the EntityKey object using the complex property method or property method for the DbEntityEntry. I couldn't find any examples MSDN, but I presume that this is possible in Entity Framework 5. I Will not know the name of the entity key or entity as I am using a generic repository interface.

like image 729
Breadtruck Avatar asked Apr 09 '13 04:04

Breadtruck


1 Answers

If you have a DbEntityEntry object you get the EntityKey by first finding the wrapped ObjectContext:

var oc = ((IObjectContextAdapter)dbContext).ObjectContext;

Then you can find the entity key by

oc.ObjectStateManager.GetObjectStateEntry(dbEntityEntryObject.Entity)
    .EntityKey

EDIT

I created two extension methods that get you close to what you want:

public static EntityKey GetEntityKey<T>(this DbContext context, T entity)
    where T : class
{
    var oc = ((IObjectContextAdapter)context).ObjectContext;
    ObjectStateEntry ose;
    if (null != entity && oc.ObjectStateManager
                            .TryGetObjectStateEntry(entity, out ose))
    {
        return ose.EntityKey;
    }
    return null;
}

public static EntityKey GetEntityKey<T>( this DbContext context
                                       , DbEntityEntry<T> dbEntityEntry)
    where T : class
{
    if (dbEntityEntry != null)
    {
        return GetEntityKey(context, dbEntityEntry.Entity);
    }
    return null;
}

Now you can do

var entityKey = dbContext.GetEntityKey(entity);

or

var entityKey = dbContext.GetEntityKey(dbEntityEntryObject);

The runtime will pick the right overload.

Note that the syntax that you proposed (dbEntityEntryObject.Property<EntityKey>()) can't work when the entity has a composite key. You have to get the EntityKey from the entity itself.

like image 114
Gert Arnold Avatar answered Oct 04 '22 23:10

Gert Arnold