首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架5更新记录

实体框架5更新记录
EN

Stack Overflow用户
提问于 2013-03-11 10:27:12
回答 9查看 452.8K关注 0票数 892

在ASP.NET MVC3环境中,我一直在探索在实体框架5中编辑/更新记录的不同方法,但到目前为止,它们都没有勾选我需要的所有框。我会解释原因。

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

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

代码语言:javascript
复制
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();
}    

优点

  • 可以指定哪些属性更改。
  • 视图不需要包含所有属性

缺点

  • 2 x数据库查询,加载原始数据,然后更新

方法2-加载原始记录,设置更改的值

代码语言:javascript
复制
var original = db.Users.Find(updatedUser.UserId);

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

优点

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

缺点

  • 视图需要包含每个属性。
  • 2 x数据库查询,加载原始数据,然后更新

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

代码语言:javascript
复制
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();

优点

  • 对数据库进行1x查询以更新

缺点

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

问题

我的问题是,我有一个干净的方法可以实现这套目标吗?

  • 可以指定哪些属性更改。
  • 视图不需要包含所有属性(例如密码!)
  • 对数据库进行1x查询以更新

我知道这是一个很小的事情要指出,但我可能错过了一个简单的解决办法。(如不采用方法,则以方法为准;)

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-03-11 13:12:34

你在寻找:

代码语言:javascript
复制
db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();
票数 686
EN

Stack Overflow用户

发布于 2013-08-01 21:01:38

我真的很喜欢被接受的答案。我相信还有另一种方法来解决这个问题。假设您有一个非常短的属性列表,您不希望在视图中包含这些属性,所以在更新实体时,这些属性将被省略。假设这两个字段是密码和SSN。

代码语言:javascript
复制
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();   

此示例允许您在向用户表和视图中添加新字段后,基本上不使用业务逻辑。

票数 176
EN

Stack Overflow用户

发布于 2013-11-12 11:33:31

代码语言:javascript
复制
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();
票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15336248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档