例如,我有这个:
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
而不是数据源
我正在使用DataBase First方法。我这样做的原因是因为我需要比较新旧记录以进行审计。
答案 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
方法首先尝试从上下文缓存中获取实体。