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