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