在entity framework中更新排除属性
我一直在寻找一种合适的方式来标记一个属性,在MVC中更新模型时不会被改变。
例如,我们来看看这个小模型:
class Model { [Key] public Guid Id {get; set;} public Guid Token {get; set;} //... lots of properties here ... }
那么编辑方法MVC创build如下所示:
[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();
它会更新,但没有令牌属性
创build新的模型,将有您想要更新的有限的一组属性。
即如果您的实体模型是:
public class User { public int Id {get;set;} public string Name {get;set;} public bool Enabled {get;set;} }
您可以创build自定义视图模型,允许用户更改名称,但不启用标志:
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
再次加载您的对象在控制器中并运行此方法。 您可以指定一个白名单和一个黑名单参数,应该或不应该更新。
- ASP.NET MVC 2 – 与jQuery的Ajax响应失败
- 如何在asp.net mvc中添加ID属性到Html.BeginForm()?
- DropDownlist或DropDownListFor Html助手之间的区别
- Ajax调用后MVC3不显眼的validation工作
- ASP.NET MVC 3:dynamic/ AJAX内容的不显眼客户端validation所需的步骤
- 如何使用MVC3 Razor从Viewbag呈现HTML
- 什么是ModelState.IsValid在NerdDinner中的ASP.NET MVC有效?
- jQuery中$ .getJSON()和$ .ajax()之间的区别
- 如何将parameter passing给mvc 4中的局部视图