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);
}