如何用C#或LINQ修改SQLite数据库中指定Id的City名称?
解决方案
首先必须修正你的City模型错误:Name字段被定义成了bool类型,这根本无法存储城市名称字符串,先改成string类型:
public partial class City { public int Id { get; set; } public string Name { get; set; } // 替换bool为string,否则无法存储城市名 }
修正后需要重新生成数据库迁移并更新SQLite数据库(执行Add-Migration FixCityNameType和Update-Database命令),否则数据库字段类型不匹配会报错。
接下来提供三种控制器中修改指定ID城市名称的实现方式:
方式一:查询实体后修改(最直观)
先从数据库加载目标实体,修改属性后保存变更:
public IActionResult Change() { var selectedId = 1; var newName = "Paris"; // 查找对应ID的城市实体 var targetCity = _cityContext.CityDBC.FirstOrDefault(x => x.Id == selectedId); if (targetCity != null) { targetCity.Name = newName; // 修改名称 _cityContext.SaveChanges(); // 保存到数据库 } return RedirectToAction("Home"); }
EF Core会自动跟踪实体的属性变化,调用SaveChanges()时会生成对应的UPDATE语句更新SQLite数据库。
方式二:无跟踪更新(无需加载完整实体)
适合不需要读取实体其他属性的场景,直接构造实体并标记修改状态:
public IActionResult Change() { var selectedId = 1; var newName = "Paris"; // 构造仅包含ID和新名称的实体 var city = new City { Id = selectedId, Name = newName }; // 附加实体并仅标记Name字段为修改状态(避免覆盖其他字段) _cityContext.Attach(city); _cityContext.Entry(city).Property(x => x.Name).IsModified = true; _cityContext.SaveChanges(); return RedirectToAction("Home"); }
这种方式不需要查询数据库,减少一次数据库交互,性能更优。
方式三:直接执行更新语句(EF Core 7+ 推荐)
使用ExecuteUpdate直接生成SQL更新语句,完全不需要加载实体,性能最高:
public IActionResult Change() { var selectedId = 1; var newName = "Paris"; // 直接在数据库层面执行更新,返回受影响的行数 var updatedRows = _cityContext.CityDBC .Where(x => x.Id == selectedId) .ExecuteUpdate(x => x.SetProperty(c => c.Name, newName)); // 可通过updatedRows判断是否成功找到并更新目标记录 return RedirectToAction("Home"); }
内容的提问来源于stack exchange,提问作者4est
相关产品推荐
相关产品推荐

