提问者:小点点

实体框架5更新记录


我一直在探索在ASP.NET MVC3环境中的Entity Framework5中编辑/更新记录的不同方法,但到目前为止,没有一种方法能满足我所需的所有要求。我会解释原因的。

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

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

专业人士

缺点

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

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

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

专业人士

缺点

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

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

专业人士

缺点

问题

我要问你们几个问题;有没有一种干净的方法可以让我实现这一套目标?

我知道这是一个相当小的事情要指出,但我可能错过了一个简单的解决办法。如果不是,方法一将占上风-)


共3个答案

匿名用户

您正在寻找:

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

匿名用户

我真的很喜欢被接受的答案。我认为还有另一种方法来处理这个问题。假设您有一个很短的属性列表,您不想在视图中包含这些属性,因此在更新实体时,这些属性将被省略。假设这两个字段是Password和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();   

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

匿名用户

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