You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:42:37