我正在尝试获取已加载到上下文中的实体。它是一个遗留系统,因此我无法更改上下文创建(以便我可以通过DbSet访问它)并且必须使用ObjectSet API。
ObjectSet API中DbSet.Local属性的最佳等价物是什么?
看起来我可以使用类似objectContext.GetObjectByKey(key)
或objectContext.ObjectStateManager.GetObjectStateEntry(key)
的内容,但EntityKey的创建似乎涉及将类型和属性名称硬编码为字符串:
var key = new EntityKey("MyEntities.Employees", "EmployeeID", 1);
有更好的方法吗?
答案 0 :(得分:1)
基于由Gert和她的书(“编程实体框架”)链接的Julie Lerman的博客文章,看起来我正在使用这个辅助方法:
public class MyUnitOfWork : MyEntities
{
public IEnumerable<T> GetLocalObjects<T>() where T : class
{
var localObjects = ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged)
.Where(e => e.Entity is T)
.Select(e => e.Entity as T);
return localObjects;
}
}
然后以下列方式使用它:
_myUnitOfWork.GetLocalObjects<Employee>().First(x => x.EmployeeID == 1);
答案 1 :(得分:1)
或以上作为扩展方法:
public static IEnumerable<T> Local<T>(this ObjectSet<T> ObjectSet) where T : class
{
var localObjects = ObjectSet.Context.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Unchanged)
.Where(e => e.Entity is T)
.Select(e => e.Entity as T);
return localObjects;
}
用法:
Row row = Context.MyObjectSet.Where(mos => mos.Key == key).FirstOrDefault();
if (row == null) // no row exists
{
// see if the row exists in the Entity Cache
row = Context.MyObjectSet.Local<MyObjectType>().Where(mos => mos.Key == key).FirstOrDefault();
if (row == null)
{
row = new MyObjectType(); // no, so create a new one
Context.MyObjectSet.AddObject(row);
}
}