2013-06-26 48 views
1

我正在嘗試獲取已經加載到上下文中的實體。這是一個遺留系統,所以我無法更改上下文創建(以便我可以通過DbSet訪問它),並且必須通過ObjectSet API進行工作。什麼是DbSet <TEntity>的等價物。本地ObjectSet <TEntity>?

什麼是ObjectSet API中DbSet.Local屬性的最佳等價物?

它看起來像我可以使用類似objectContext.GetObjectByKey(key)objectContext.ObjectStateManager.GetObjectStateEntry(key)而是的EntityKey的創作好像硬編碼類型和屬性名稱作爲字符串包括:

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

有沒有更好的辦法?

+0

見[這裏](http://msdn.microsoft.com/en-us/magazine/hh781018.aspx)下'DbSet.Local'。 –

+0

謝謝,這很有幫助。看看她的書。看起來像GetObjectStateEntries它。 – boris

+0

也許作爲回答發佈呢? –

回答

1

基於朱莉·勒曼的由格特和她的書(「編程實體框架」)鏈接的博客文章,它看起來像我這個helper方法去:

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

還是上面作爲擴展方法:

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); 
    } 
} 
相關問題