CSharp - 实体Framework 5 更新一个记录

  显示原文与译文双语对照的内容
0 0

我一直在探索不同的编辑/更新一条记录的方法在 Entity Framework 5在一个 ASP.NET MVC3环境,但到目前为止没有一个刻度不要放过任何我需要的。 我解释为什么。

我发现了三种方法,我将提到它们的优缺点:

1 方法- 加载原始记录,更新每个属性


var original = db.Users.Find(updatedUser.UserId);

if (original!= null)
{
 original.BusinessEntityId = updatedUser.BusinessEntityId;
 original.Email = updatedUser.Email;
 original.EmployeeId = updatedUser.EmployeeId;
 original.Forename = updatedUser.Forename;
 original.Surname = updatedUser.Surname;
 original.Telephone = updatedUser.Telephone;
 original.Title = updatedUser.Title;
 original.Fax = updatedUser.Fax;
 original.ASPNetUserId = updatedUser.ASPNetUserId;
 db.SaveChanges();
} 

  • 可以指定哪些属性更改
  • 视图不需要包含每个属性

Cons

  • 2 对数据库进行查询以加载原始数据,然后更新它

方法 2 变化- 加载原始记录,集中值


var original = db.Users.Find(updatedUser.UserId);

if (original!= null)
{
 db.Entry(original).CurrentValues.SetValues(updatedUser);
 db.SaveChanges();
}

  • 只将修改后的属性发送到数据库

Cons

  • 视图需要包含每个属性
  • 2 对数据库进行查询以加载原始数据,然后更新它

3 方法- 将更新后的记录,并设置状态附加到 EntityState.Modified


db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();

  • 1 在数据库上查询以更新

Cons

  • 无法指定哪些属性更改
  • 视图必须包含每个属性

问题

我给你们的问题是,有一种干净的方法来实现这一套目标?

  • 可以指定哪些属性更改
  • 视图不需要包含每个属性( 如密码) !
  • 1 在数据库上查询以更新

我理解这是一个很小的问题,但是我可能缺少一个简单的解决方案。 如果不是方法,则优先使用- )

时间: 原作者:

0 0

你正在寻找:


db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
//other changed properties
db.SaveChanges();

原作者:
0 0

我非常喜欢接受的答案。 我相信还有另一种方法来解决这个问题。 假设你有一个非常短的属性,你不想在视图中包含这些属性,因此在更新实体时,这些属性将被忽略。 假设这两个字段是密码和 SSN 。


db.Users.Attach(updatedUser);

var entry = db.Entry(updatedUser);
entry.State = EntityState.Modified;

entry.Property(e => e.Password).IsModified = false;
entry.Property(e => e.SSN).IsModified = false; 

db.SaveChanges(); 

这里示例允许你在将新字段添加到用户表和视图后,基本上保持业务逻辑。

原作者:
0 0

foreach(PropertyInfo propertyInfo in original.GetType().GetProperties()) {
 if (propertyInfo.GetValue(updatedUser, null) == null)
 propertyInfo.SetValue(updatedUser, propertyInfo.GetValue(original, null), null);
}
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();

原作者:
0 0

我在知识库基类中添加了一个额外的更新方法,它类似于由scaffold生成的更新方法。 不是将整个对象设置为修改,而是设置一组单独的属性。 ( T 是类泛型参数。)


public void Update(T obj, params Expression<Func<T, object>>[] propertiesToUpdate)
{
 Context.Set<T>().Attach(obj);

 foreach (var p in propertiesToUpdate)
 {
 Context.Entry(obj).Property(p).IsModified = true;
 }
}

然后调用示例:


public void UpdatePasswordAndEmail(long userId, string password, string email)
{
 var user = new User {UserId = userId, Password = password, Email = email};

 Update(user, u => u.Password, u => u.Email);

 Save();
}

我喜欢一次到数据库的行程。 尽管为了避免重复的属性集,最好使用视图模型。 还没有完成,因为我不知道如何避免将验证消息放到我的域项目中。

原作者:
0 0

它可能会帮助你 !


//POST api/setting
[HttpPost]
public void UpdateUser([FromBody]User detail, int id)
{
 using (OBPCXALRTEntities entities = new OBPCXALRTEntities())
 {
//Get the specific user from Database.
 var user = entities.Users.Where(x => x.ContactEmail == detail.ContactEmail).FirstOrDefault();
 if (user!= null)
 {
 user.ContactName = detail.ContactName;
 user.ContactMobile = detail.ContactMobile;
 user.AlertOptIn = detail.AlertOptIn;
 user.isPrimary = detail.isPrimary;
 user.LastUpdateBy = detail.ContactName;
 user.LastUpdateDate = DateTime.Now;

//Update to database.
 entities.SaveChanges();
 }
 }
}

原作者:
...