1

我正在尝试获取已加载到上下文中的实体。这是一个遗留系统,因此我无法更改上下文创建(以便我可以通过 DbSet 访问它)并且必须通过 ObjectSet API 工作。

ObjectSet API 中 DbSet.Local 属性的最佳等效项是什么?

看起来我可以使用类似的东西objectContext.GetObjectByKey(key)objectContext.ObjectStateManager.GetObjectStateEntry(key)但 EntityKey 的创建似乎涉及硬编码类型和属性名称作为字符串:

var key = new EntityKey("MyEntities.Employees", "EmployeeID", 1);

有没有更好的办法?

4

2 回答 2

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);
    }
}
于 2014-02-04T21:34:06.820 回答
1

根据 Gert 和她的书(“Programming Entity Framework”)链接的 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);
于 2013-06-27T16:51:45.783 回答