2012-09-15 88 views
0

最後一個弱我有一個我嘗試重新創建的錯誤。一塊現有的代碼在數據庫上進行了批量插入。但是,數據庫中的值不允許重複。舊代碼在每次使用SaveChanges添加AddObject後都將更改保留到數據庫中。這表現不佳。因此,不是每次我在每1000條記錄後保存它(並在交易中完成此操作,但與此示例無關),而不是保存它。AddObject之後的實體框架查詢

下面的這段代碼給出了我做了什麼的概述。

 TestEntities test = new TestEntities(); 

     for (int i = 0; i < 10; i++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       string q = j.ToString(); 
       if (!test.warehouses.Any(x => x.combi == q)) 
       { 
        warehouse wh = new warehouse(); 
        wh.combi = j.ToString(); 
        wh.ean = j.ToString(); 
        test.warehouses.AddObject(wh); 
       } 
      } 

     } 
     test.SaveChanges(); 

我不知道那是什麼讓任何疑問給出了數據庫沒有結果的實體框架只查詢數據庫中的數據,而不是待處理的數據(和我是假設會有一個結果。 )因此,這會在上面的代碼中導致不需要的重複。

現在我解決了它,以便儘快存儲要添加到內存中的對象,然後將它們存儲在數據庫中。這會起作用,但會在代碼中產生很多開銷。有沒有辦法解決這個問題?你能告訴EF來處理數據庫和待處理的更改嗎?所有的ORM都是這樣工作的嗎?

感謝, 帕特里克

回答

1

有類似的問題,我決定檢查數據庫,你這樣做,檢查本地數據面對:

if(!test.warehouses.Local.Any(x => x.combi == q) 
     && !test.warehouses.Any(x => x.combi == q)) 

這應該工作。

編輯: 但它沒有。然而,這並不:

var isLocal = (test as System.Data.Objects.ObjectContext).ObjectStateManager 
    .GetObjectStateEntries(System.Data.EntityState.Added) 
    .Any(x => (x.Entity as warehouse).combi == q); 
if(!isLocal && !test.warehouses.Any(x => x.combi == q)) { 
    // ... 
} 

我必須指出,IDbSet<>(通過我的代碼,而不是第一次的ObjectSet<>通過模型設計器創建使用)具有.Local財產,所以沒有必要查詢ObjectStateManager。我知道代碼首先是完全不同的東西,但您也可以非常高效:使用Microsoft SQL Server Management Studio設計數據庫並運行優秀反向工程代碼首先Entity Framework Power Tools使用默認或定製(如果需要)T4模板獲得幾乎任何東西http://en.wiktionary.org/wiki/your_mileage_may_vary

+0

我試過本地,但它說它不知道本地。 (首先與設計師一起使用數據庫) – Patrick

+0

@Patrick我首先使用代碼,但是如果Local無法識別[link](http://msdn.microsoft.com/en-us/library/gg679246(v = vs.103))。 aspx),那麼ObjectStateManager可以幫助:[link](http://stackoverflow.com/a/6400097/551322) – nrodic

+0

在項目中,我們有一個codefirst項目,在那裏我們有Local屬性。謝謝。 – Patrick