13

我不应该能够使用 DbEntityEntry 的复杂属性方法或属性方法来获取 EntityKey 对象吗?我找不到任何示例MSDN,但我认为这在 Entity Framework 5 中是可能的。我不知道实体键或实体的名称,因为我使用的是通用存储库接口。

4

1 回答 1

34

如果你有一个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从实体本身获取。

于 2013-04-09T07:40:54.157 回答