查找具有表名和键值的实体

时间:2014-11-23 15:21:39

标签: entity-framework

例如,我有这个:

    private object GetEntityFromKey(ObjectStateEntry entry)
    {
        object entity = null;

        var key = entry.EntityKey;
        var keyValues = entry.EntityKey.EntityKeyValues;

        return entity; 
    }

我的问题是如何使用两个已知因素检索实体:keykeyValues

我需要这是动态的,所以返回的类型是object

我可以使用以下方式获取实体:

this.GetObjectByKey(key)

但这将从ObjectStateManager而不是数据源

返回实体

我正在使用DataBase First方法。我这样做的原因是因为我需要比较新旧记录以进行审计。

1 个答案:

答案 0 :(得分:1)

如果您使用的是EF v.4.2或更高版本,则可以从现有DbContext实例创建ObjectContext。获得此DbContext后,您可以使用其Find方法按键获取对象。

所有这些都包含在一个方法中,并且省略了空检查,我想这可能对您有用:

public static class ObjectContextExtensions
{
    public static T GetOriginalEntity<T>(this ObjectContext oc, T localEntity)
        where T : class
    {
        ObjectStateEntry ose;
        oc.ObjectStateManager.TryGetObjectStateEntry(localEntity, out ose);
        var keys = ose.EntityKey.EntityKeyValues.Select(k => k.Value).ToArray();
        using (var db = new DbContext(oc, false))
        {
            return db.Set<T>().Find(keys);
        }
    }

}

用法:

Entity entity;

using(var objContext = new MyObjectContext())
{
    entity = objContext.Entities.Single(e => e.Id == someId);

    ...
}

using(var objContext = new MyObjectContext())
{
    var entityOrg = objContext.GetOriginalEntity(entity);
}

您必须在GetOriginalEntity中使用新的上下文,因为Find方法首先尝试从上下文缓存中获取实体。