如何更新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
的内容,有什么办法吗?我不想写那么多关于这件事的文章。
如果您没有从源获取原始数据,并且您不想更新的属性是已知的,那么您实际上可以使用反射来实现您想要的。你要做的是创建一个扩展方法(如果你喜欢的话,也可以是普通方法),它会改变属性的状态,如下所示:
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();
}
您可以在实体框架中尝试更改跟踪。