Entity framework 将部分数据从模型保存到db MVC4

Entity framework 将部分数据从模型保存到db MVC4,entity-framework,asp.net-mvc-4,model,Entity Framework,Asp.net Mvc 4,Model,我有一个模型 public partial class User { public int user_id { get; set; } public virtual string username { get; set; } public string password { get; set; } public string salt { get; set; } public string email { get; set; } public sb

我有一个模型

public partial class User
{
    public int user_id { get; set; }
    public virtual string username { get; set; }
    public string password { get; set; }
    public string salt { get; set; }
    public string email { get; set; }
    public sbyte status { get; set; }
    public System.DateTime creation_date { get; set; }
}
我想让用户能够从页面更改邮件

所以我创建了我的控制器

    [Authorize]
    [HttpGet]
    public ActionResult Setup()
    {
        //retrieve the object user
        return View(CustomDbFunctions.GetUserEntity(User, db));
    }
那么在我看来,

@Html.EditorFor(u => u.email)
但是当我使用

    [HttpPost]
    public ActionResult Setup(User user)
    {
        if (ModelState.IsValid)
        {

            db.Entry(user).State = System.Data.EntityState.Modified;
            db.SaveChanges();
            return Redirect("Index");
        }
        return View(user);
    }
系统返回一个错误,因为对象用户只包含修改过的邮件。所有其他属性(即用户id、密码)均已消失。
如何将正确修改的整个对象发送回数据库?

要使用实体框架更新某些内容,必须首先从数据库获取实体:

if (ModelState.IsValid)
    {
        var existingUser = db.Users.FirstOrDefault(u => u.user_id == user.user_id);

        existingUser.email = user.email;

        db.SaveChanges();
        return Redirect("Index");
    }
为了让它起作用,你还需要在你的视图中,在表单内部,有类似

@Html.HiddenFor(u => u.user_id)

但是,我假设您在会话中的某个位置有用户Id。你应该从那里而不是从隐藏字段使用它,因为黑客可以更改隐藏标记中的值并编辑其他用户的电子邮件。

如果你使用mvc的模型绑定,那么你需要使用其他属性作为隐藏字段,这样,在发回时,将返回整个对象,而不是仅返回电子邮件。

他只想允许修改电子邮件。如果所有字段都在隐藏字段中,那么用户可以手动编辑隐藏字段并编辑用户对象中的所有内容。为了能够进行任何类型的编辑,他至少需要将Id保留为隐藏字段,这使得整个情况不那么安全。我认为公开所有需要公开主键的字段没有问题。您不想直接从用户输入中保存数据,如Salt、Status或Username。Id是必需的,他所能做的最糟糕的事情就是更改Id并为其他用户更新电子邮件。但是,登录后该Id应保存到会话中,并在本例中从会话中使用,而不是传递到隐藏字段。或db.Users.Finduser.user_Id;