0

我正在尝试替换我的 EF 代码优先配置的 Seed() 方法中包含http:的所有 url。https:我有以下内容:

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,甚至会发生此错误。该字段只是一个非必需的字符串,所以我认为验证不会由于不正确的数据类型而失败......它还能是什么?

4

2 回答 2

3

我认为您应该将代码更改为此

foreach (var doc in context.Docs)

由于var docs = context.Docs.ToList();将拉取内存中的所有对象,并且上下文无法跟踪任何更改。

于 2013-07-30T21:46:36.827 回答
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();
于 2013-07-30T21:45:34.430 回答