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

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)

它会更新但没有令牌属性

  • 这也应该是在更新模型值之后 db.Entry (model).CurrentValues.SetValues(sourceModel); 如果没有,则该属性也会在保存时更新。 (4认同)
  • 更新:要使其在 EF 6 中工作..您需要 db.Model.Attach(model); (3认同)
  • 如果你使用`AddOrUpdate`怎么办? - 你怎么知道使用`EntityState.Modified`或`EntityState.Added`? (2认同)
  • 请注意其他事项,这里的顺序很重要:如果在设置db.Entry(model).Property(x => x.Token)之后设置了db.Entry(model).State = EntityState.Modified;`。 IsModified =假; `,该属性将在保存时更新。 (2认同)

Jes*_*sse 9

任何人都在寻找如何在 EF Core 上实现这一目标。它基本上是一样的,但你的 IsModified 需要在你添加要更新的模型之后。

db.Update(model);
db.Entry(model).Property(x => x.Token).IsModified = false;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)


Adm*_*vić 8

创建具有您想要更新的有限属性集的新模型.

即如果您的实体模型是:

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属性将保持不变.我使用了简单的模型,但我认为你会得到如何使用它的图片.

  • 我不想和你争论.黑名单和白名单是不同的方法,结果相同,您的方法是白名单.正如我之前所说,有很多方法,但我特别询问一个方法.此外,您的解决方案仅适用于可空类型. (2认同)