首页 > 解决方案 > EF Core:仅更新来自断开实体的修改属性的列

问题描述

我将 Entity Framework Core 3.1 与 SQL Server 一起使用。

我搜索如何更新列仅用于断开连接实体的修改属性,例如:

public void UpdateOrderCustomer(int orderId, string customerName)
{
    var order = new Order { Id = orderId };

    using(var context = new MyDbContext())
    {
        context.Update(order);
        order.Customer = customerName;
        context.SaveChanges();
    }
}

但这会更新所有订单的列。

一种解决方案是在更新属性之前加载实体,例如:

public void UpdateOrderCustomer(int orderId, string customerName)
{
    using(var context = new MyDbContext())
    {
        var order = context.Orders.Single(o => o.Id == orderId);
        order.Customer = customerName;
        context.SaveChanges();
    }
}

但是要加载实体,这会执行一个额外的无用查询。

我希望有一种BeginTracking方法,但我还没有找到这个或任何类似的功能。

如何仅为来自断开连接的实体的修改属性更新列?

标签: c#.netentity-framework.net-coreentity-framework-core

解决方案


您可以像这样更新单个属性或分离的实体:

public void ChangePassword(int userId, string password)
{
  var user = new User() { Id = userId, Password = password };
  using (var db = new MyEfContextName())
  {
    db.Users.Attach(user);
    db.Entry(user).Property(x => x.Password).IsModified = true;
    db.SaveChanges();
  }
}

推荐阅读