Как вы получаете объект EntityKey DbEntityEntry с неизвестным именем

Нельзя ли получить объект EntityKey, используя метод сложных свойств или метод свойств для DbEntityEntry. Я не мог найти никаких примеров MSDN, но я полагаю, что это возможно в Entity Framework 5. Я не буду знать имя ключа сущности или объекта как Я использую общий интерфейс репозитория.

Ответ 1

Если у вас есть объект DbEntityEntry, вы получаете EntityKey, сначала обнаружив завернутый ObjectContext:

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

Затем вы можете найти ключ сущности

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

ИЗМЕНИТЬ

Я создал два метода расширения, которые приближают вас к тому, что вы хотите:

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;
}

Теперь вы можете сделать

var entityKey = dbContext.GetEntityKey(entity);

или

var entityKey = dbContext.GetEntityKey(dbEntityEntryObject);

Время выполнения выбирает правильную перегрузку.

Обратите внимание, что предложенный вами синтаксис (dbEntityEntryObject.Property<EntityKey>()) не может работать, если объект имеет составной ключ. Вы должны получить EntityKey от самой сущности.