在实体框架中更新排除属性

在MVC中更新模型时,我一直在寻找一种合适的方法来标记属性不被更改。

例如,我们来看看这个小模型:

class Model
{
    [Key]
    public Guid Id {get; set;}
    public Guid Token {get; set;}

    //... lots of properties here ...
}

那么编辑方法MVC创建如下所示:

[HttpPost]
public ActionResult Edit(Model model)
{
    if (ModelState.IsValid)
    {
        db.Entry(model).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(model);
}

现在如果我的视图不包含令牌,它将通过该编辑无效。

我正在寻找这样的东西:

db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).State = PropertyState.Unmodified;
db.SaveChanges();

到目前为止,我发现的最佳方式是包容性的,并设置我想要包含的所有属性,但我真的只想说哪些属性被排除。


我们可以这样使用

 db.Entry(model).State = EntityState.Modified;
 db.Entry(model).Property(x => x.Token).IsModified = false;
 db.SaveChanges();

它会更新但没有Token属性


创建一个新模型,该模型将包含您想要更新的有限属性集。

也就是说,如果您的实体模型是:

public class User
{
    public int Id {get;set;}
    public string Name {get;set;}
    public bool Enabled {get;set;}
}

您可以创建自定义视图模型,以允许用户更改名称,但不启用标志:

public class UserProfileModel
{
   public int Id {get;set;}
   public string Name {get;set;}
}

当您想要执行数据库更新时,请执行以下操作:

YourUpdateMethod(UserProfileModel model)
{
    using(YourContext ctx = new YourContext())
    { 
        User user = new User { Id = model.Id } ;   /// stub model, only has Id
        ctx.Users.Attach(user); /// track your stub model
        ctx.Entry(user).CurrentValues.SetValues(model); /// reflection
        ctx.SaveChanges();
    }
}

当您调用此方法时,您将更新名称,但已启用属性将保持不变。 我使用简单的模型,但我想你会得到如何使用它的图片。


我猜你不希望在某些情况下更改属性,因为如果你不打算在应用程序中使用它,只需从模型中删除它。

如果您想在某些情况下使用它,并避免在上述情况下发生“无效”,则可以尝试:

  • 使用HiddenFor隐藏视图中的参数:

    @Html.HiddenFor(m => m.Token)

  • 这将使您的原始价值保持不变并传回给控制器。

  • 使用TryUpdateModel :http://msdn.microsoft.com/en-us/library/dd460189( TryUpdateModel .aspx
  • 从您的DBSet再次加载控制器中的对象并运行此方法。 您可以指定应该或不应该更新的参数的白名单和黑名单。

    链接地址: http://www.djcxy.com/p/33573.html

    上一篇: Exclude Property on Update in Entity Framework

    下一篇: Problems to update user information