2015-06-04 52 views
0

請參閱此代碼段:爲什麼此批量插入不能按預期工作?

while ((line = rdr.ReadLine()) != null) 
{ 
    .... 
    Departamento depto = db.Departamento.FirstOrDefault(d => d.DepNombre.Equals(departamento, StringComparison.InvariantCultureIgnoreCase)); 
    if (depto == null) 
    { 
     depto = new Departamento(); 
     depto.DepNombre = departamento; 
     depto.Pais = pais; 
     depto.DepCreadoEn = DateTime.Now; 
     db.Departamento.Add(depto); 
    } 
    ... 
} 
db.SaveChanges(); 

正如你看到的,我有一個循環,是將數據插入到表Departamento在數據庫中。例如,這是從Excel工作表導入記錄。

根據名稱(DepNombre),「if」是否存在不在數據庫中的記錄。當該名稱存在時,獲取當前對象,以便它不會在數據庫表中出現兩次。

正如您所看到的,出於性能原因,我在迴路後呼叫SaveChanges()

好奇的是該對象當前沒有添加到集合中,所以「depto」對象總是返回null,並多次添加該記錄。

例如,數據庫中目前有1條記錄。通過使用即時窗口,我可以撥打db.Departamento.Count()並找到1條記錄。撥打db.Departamento.Add後,我撥打相同的Count()方法,1再次返回。在這種情況下,顯然FirstOrDefault方法永遠不會返回任何東西。

SaveChanges調用實際上會使用導入的記錄填充表。

請幫忙嗎?

+0

那麼,你明白爲什麼它不工作,你只是想找人爲你解決它嗎?或者你正在尋找一個解釋,爲什麼它不起作用? – sstan

+0

我需要解決這個錯誤...因爲這個原因,我需要知道爲什麼它不能正常工作....我想如果我將這個對象添加到集合中,它應該在下一個集成中考慮,所以, FirstOrDefault調用將返回它。 – jstuardo

+0

執行添加僅在內存中添加實體。在執行SaveChanges()之前,沒有任何操作被推送到數據庫。因爲在最後(在循環完成後)執行了SaveChanges(),所以循環中的查詢總是返回null,因爲它在數據庫中確實不存在。 – sstan

回答

0
var list=new List<Departamento>(); 
/* Get from Excel */ 
while ((line = rdr.ReadLine()) != null) 
{ 
    .... 
    depto = new Departamento(); 
    depto.DepNombre = departamento; 
    depto.Pais = pais; 
    depto.DepCreadoEn = DateTime.Now; 
    list.Add(depto); 
} 

/* Group By */ 
var list2=list.GroupBy(x=>x.DepNombre,(key,g)=>g.OrderBy(e=>e.DepCreadoEn).First()); 

/* Get list of DepNombre to exclude */ 
var badDepts=db.Departmento 
    .Where(d=>list2.Any(l2=>l2.DepNombre==d.DepNombre)) 
    .Select(d=>d.DepNombre); 

/* Exclude them */ 
var goodDepts=list2.Where(l=>!badDepts.Any(bd=>bd==l.DepNombre)); 

/* Add to database */ 
db.Departmento.AddRange(goodDepts); 

/* Save */ 
db.SaveChanges(); 
相關問題