什么是ObjectSet <tentity>中的DbSet <tentity> .Local?</tentity> </tentity>

时间:2013-06-26 19:53:14

标签: entity-framework

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

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

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

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

有更好的方法吗?

2 个答案:

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