Man*_*ert 74 c# asp.net-mvc entity-framework
在MVC中更新模型时,我一直在寻找一种标记属性的正确方法.
例如,让我们采用这个小模型:
class Model
{
[Key]
public Guid Id {get; set;}
public Guid Token {get; set;}
//... lots of properties here ...
}
Run Code Online (Sandbox Code Playgroud)
然后MVC创建的编辑方法如下所示:
[HttpPost]
public ActionResult Edit(Model model)
{
if (ModelState.IsValid)
{
db.Entry(model).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
现在如果我的View不包含令牌,它将通过该编辑无效.
我正在寻找这样的东西:
db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).State = PropertyState.Unmodified;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现的最好的方法是包容并设置我想要包含的所有属性,但我真的只想说哪些属性被排除在外.
Nit*_*nic 131
我们可以这样使用
db.Entry(model).State = EntityState.Modified;
db.Entry(model).Property(x => x.Token).IsModified = false;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
它会更新但没有令牌属性
任何人都在寻找如何在 EF Core 上实现这一目标。它基本上是一样的,但你的 IsModified 需要在你添加要更新的模型之后。
db.Update(model);
db.Entry(model).Property(x => x.Token).IsModified = false;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
创建具有您想要更新的有限属性集的新模型.
即如果您的实体模型是:
public class User
{
public int Id {get;set;}
public string Name {get;set;}
public bool Enabled {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
您可以创建允许用户更改Name的自定义视图模型,但不能更改Enabled标志:
public class UserProfileModel
{
public int Id {get;set;}
public string Name {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
如果要进行数据库更新,请执行以下操作:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当您调用此方法时,您将更新名称,但Enabled属性将保持不变.我使用了简单的模型,但我认为你会得到如何使用它的图片.