如何更新ef中的某些字段

时间:2016-07-30 08:56:42

标签: c# .net entity-framework

如果有一个名为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,有什么办法解决这个问题。 ?我不想写这么多次。

2 个答案:

答案 0 :(得分:1)

如果您没有从源获取原始数据,并且您知道不想更新的属性,您实际上可以使用 Reflection 来实现您想要的效果。您需要做的是创建一个扩展方法(如果您愿意,也可以是普通方法),它会更改属性状态,如下所示:

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();
}

答案 1 :(得分:0)