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