Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 查找具有表名和键值的实体_Entity Framework - Fatal编程技术网

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

Entity framework 查找具有表名和键值的实体,entity-framework,Entity Framework,例如,我有: private object GetEntityFromKey(ObjectStateEntry entry) { object entity = null; var key = entry.EntityKey; var keyValues = entry.EntityKey.EntityKeyValues; return entity; } 我的问题是如何使用两个已知因素检索实体:ke

例如,我有:

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

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

        return entity; 
    }
我的问题是如何使用两个已知因素检索实体:
key
keyValues

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

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

this.GetObjectByKey(key)
但这将从
ObjectStateManager
而不是数据源返回实体


我使用数据库优先的方法。我之所以这样做,是因为我需要比较新记录和旧记录,以便进行审计

如果你在EF v。4.2或更高版本,您可以从现有的
ObjectContext
实例创建
DbContext
。一旦获得了这个
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);
        }
    }

}

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

您是先使用代码吗?@Derek嗨,Derek,我先使用数据库approach@Derek我还编辑了我的问题,请看一看嗨,谢谢,但我用的是EF4.1。希望这能帮助别人!
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);
}