如何更新ef中的某些字段

本文关键字:字段 ef 何更新 更新 | 更新日期: 2023-09-27 17:59:14

如果有一个名为UserInfo的实体,UserId是主键,我将实体定义为以下

UserInfo userInfonew = new UserInfo()
{
    UserId=userInfo.UserId,
    Email = userInfo.Email,
    FirstName = userInfo.FirstName,
    LastName = userInfo.LastName,
    LastUpdateBy = GetCurrentUserGuid(),
    LastUpdate = DateTime.Now
};

如果我们想更新所有实体字段,我们有如下方法

db.Entry(userInfonew).State = EntityState.Modified;
db.SaveChanges();

例如,如果我们想更新一些字段,我们只想更新电子邮件字段:

db.UserInfoes.Attach(userInfonew);
db.Entry(userInfonew).Property(x => x.Email).IsModified = true;
db.SaveChanges();

但是如果这个实体中有20个字段,如果我们想更新18个字段,剩下的两个字段不需要更新,我们必须写18次关于db.Entry(userInfonew).Property(x => x.field).IsModified = true的内容,有什么办法吗?我不想写那么多关于这件事的文章。

如何更新ef中的某些字段

如果您没有从源获取原始数据,并且您不想更新的属性是已知的,那么您实际上可以使用反射来实现您想要的。你要做的是创建一个扩展方法(如果你喜欢的话,也可以是普通方法),它会改变属性的状态,如下所示:

public static void SetPropertiesToModeified<TEntity>(
    this MyContext context, 
    TEntity entity,
    List<string> propertiesNotToUpdate)
{
    // Get properties to update. Get all properties and
    // exclude the ones you do not want to update.
    List<string> propertiesToUpdate = typeof(TEntity)
        .GetProperties()                
        .Select(m => m.Name)        
        .Except(propertiesNotToUpdate) // exculde propeties not update
        .ToList();
    DbEntityEntry<TEntity> entry = context.Entry(entity);
    propertiesToUpdate.ForEach(
        p => entry.Property(p).IsModified = true);
}

然后,你可以像这样使用它:

using(MyDbContext context = new MyDbContext())
{
    UserInfo userInfo = .....;
    context.UserInfoes.Attach(userInfo);
    List<string> propertiesNotToUpdate = new List<string>
    {
        "UserId",
        "RegistrationDate"
    };
    context.SetPropertiesToModeified(userInfo, propertiesNotToUpdate);
    context.SaveChanges();
}

您可以在实体框架中尝试更改跟踪。