2013-07-30 62 views
0

我試圖在我的EF代碼優先配置的Seed()方法中替換所有包含http:https:的URL。我有以下幾點:用Linq/C更新表中的每個項目#

var context = new DbContext(); // contains public DbSet<Doc> Docs { get; set; } 
var docs = context.Docs.ToList(); // dbcontext 

foreach (var doc in docs) 
{ 
    if (doc.ImageContent != null && doc.ImageContent.Contains("https:")) 
     doc.ImageContent = doc.ImageContent.Replace("https:", "http:"); 
} 
context.saveChanges 

但每當我運行此(從我的數據庫遷移我的種子法 - 所以我不能因爲據我所知調試) - 我得到以下錯誤:

System.Data.DataException: An exception occurred while initializing the database. See the InnerException for details. ---> System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. 

如果我將SaveChanges註釋掉,甚至會發生此錯誤。該字段只是一個非必需的字符串,所以我不認爲由於數據類型不正確而導致驗證失敗......還有什麼可能呢?

+0

除了這個問題,可能有可能你忘了'context.Entry(doc).State = EntityState.Modified' –

+0

@AlbertoLeón - 剛試過並得到了同樣的錯誤 – SB2055

+0

在你的saveChanges之後有沒有paren這樣的。 .. _db.SaveChanges();從你註釋掉這一行開始,問題不是問題。你也可以嘗試使用NuGet來讓NLog幫助調試,這就是我調試種子的方法。 – JabberwockyDecompiler

回答

3

我想你應該改變你的代碼,這

foreach (var doc in context.Docs) 

由於var docs = context.Docs.ToList();會拉入內存和上下文的所有對象不能夠跟蹤任何變化。

+2

我不敢相信這會有所作爲。由context.Docs.ToList()提取的對象也被跟蹤。 –

+0

與Gert一致,除非您使用了投影,.Configuration.AutoDetectChangesEnabled = false;或Context.Set ().AsNoTracking() –

+0

感謝您的評論。今天晚些時候我會再看看這個問題。 – zsong

2

您應該能夠對符合特定條件的任何記錄執行更新。而不是拉動整個列表縮小您的結果集。

var context = new DbContext(); // contains public DbSet<Doc> Docs { get; set; } 

foreach (var doc in context.Docs.Where(d => d.ImageContent.StartsWith("https:"))) 
{ 
    doc.ImageContent = doc.ImageContent.Replace("https:", "http:"); 
} 

context.SaveChanges(); 
+0

這是比接受的答案更好的解決方案,因爲它只從真正需要更新的數據庫中提取文檔。 –