你如何获得未知名称的DbEntityEntry的EntityKey对象(How do you get

2019-08-20 14:22发布

我不应该能够得到使用的DbEntityEntry的复杂属性方法或属性方法的EntityKey对象。 我找不到任何的例子MSDN ,但我相信这是实体框架5.尽可能我使用的是通用的仓库接口我不知道实体键或实体的名称。

Answer 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从实体本身。



文章来源: How do you get a DbEntityEntry EntityKey object with unknown name