如何获取具有未知名称的DbEntityEntry EntityKey对象

时间:2013-04-09 04:09:10

标签: c# entity-framework-5

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

1 个答案:

答案 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