使用Linq/C#更新表中的每个项

本文关键字:Linq 更新 使用 | 更新日期: 2023-09-27 18:25:30

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

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

使用Linq/C#更新表中的每个项

我认为您应该将代码更改为这个

foreach (var doc in context.Docs)

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

您应该能够对符合特定条件的任何记录执行更新。与其把整个列表拉出来,不如缩小你的结果集。

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();