2012-08-08 97 views
1

我希望在實體框架中執行查詢時使用本地跟蹤的實體在數據庫之前進行搜索時。我寫了一個複雜的例程來填充存儲庫/數據庫,現在當我使用實體框架時,它不會使用已經添加但尚未保存的實體。因此,這段代碼只能將一個類別添加到數據庫中,而不是添加n。實體框架查詢本地默認

using (Db Db = new Db()) { 
    for (int i = 0; i < 10; i++) { 
     Category Category = Db.Categories.SingleOrDefault(x => x.Name == "Hello"); 
     if (Category == null) { 
      Category = Db.Categories.Create(); 
      Category.Name = "Hello"; 
      Db.Categories.Add(Category); 
      Console.WriteLine("Adding item..."); 
     } 
    } 
} 

我該如何去做這件事?我有一個抽象,它允許我從IQueryable中更改提供者,我嘗試使用它來首先訪問Local集合。我沒有成功。請幫忙。

+1

我很好奇。您將如何計劃查詢尚未保存的實體?任何數據庫生成的id都是0,因爲它們還沒有被創建。所以沒有身份。當然,你可以查詢其他的東西,但它看起來很蹩腳而且很差。爲什麼不保留自己的項目集合並將linq用於對象呢? – 2012-08-08 22:50:37

回答

1

這是一個非常簡單,易於閱讀的方式,雖然它可能不是你想找的是什麼:

using (Db Db = new Db()) { 
    var newCategories = new List<Category>(); 
    for (int i = 0; i < 10; i++) { 
     Category category = newCategories.SingleOrDefault(x => x.Name == "Hello"); 
     if (category == null) { 
      category = Db.Categories.SingleOrDefault(x => x.Name == "Hello"); 
      if (category == null) { 
       category = Db.Categories.Create(); 
       category.Name = "Hello"; 
       Db.Categories.Add(category); 
       newCategories.Add(category); 
       Console.WriteLine("Adding item..."); 
      } 
     } 
    } 
} 

編寫自己的IQueryable的供應商是一個非常複雜的任務。

編輯:我發現this post它更詳細地說明了爲什麼你試圖做的不起作用。

想到我不知道你的特定情況在這裏,你應該在查詢到數據存儲之前嘗試刪除集合中的重複項。上述解決方案在同一時間執行此操作。

希望這會有所幫助。