我不应该使用DbEntityEntry的复杂属性方法或属性方法来获取EntityKey对象。我找不到任何示例MSDN,但我认为这在Entity Framework 5中是可行的。我不知道实体密钥或实体的名称,因为我使用的是通用存储库接口。
答案 0 :(得分:31)
如果您有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
。