使用实体框架更新部分实体(使用剃刀视图)

时间:2016-05-15 06:14:25

标签: c# asp.net-mvc entity-framework

我有一个实体:

public class Organization
{
    public int OrganizationId { get; set; }
    [Required]
    [StringLength(160)]
    public string Name { get; set; }
    public DateTime? CreatedOn { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public virtual ICollection<Team> Teams { get; set; }
    public virtual ICollection<ApplicationUser> Persons { get; set; }
}

我创建了一个OrganizationViewModel来表示要查看的数据以及创建新实体。我稍后使用Automapper将其映射,然后使用Entity Framework保存对数据库的更改...

public class OrganizationViewModel
{
    public int OrganizationId { get; set; }
    [Required]
    [StringLength(160)]
    public string Name { get; set; }
    public List<ApplicationUser> Persons { get; set; }
}

我创建了一个动作方法Edit,它只允许用户编辑属性名称(仅适用于此示例,但实际上,它确实更新了我为此问题缩减的许多其他属性)..

“修改”视图只有两个属性@Html.HiddenFor(model => model.OrganizationId)@Html.EditorFor(model => model.Name)

现在在[HttpPost]

我获得OrganizationViewModel更新Name属性,但属性Persons仍然为空,如果组织中已有用户,EF会抛出错误,因为上下文不期望这样做。

我本可以在Post方法中更新我想要更新的属性,但我不想手动完成所有操作。有没有其他方法我可以说只是更新我想要的实体。我尝试使用Bind的{​​{1}}和Include,但人员也有Exclude

帮帮我:)

1 个答案:

答案 0 :(得分:0)

如果创建的视图模型仅包含此视图编辑的OrganizationId和Name属性,则可以通过执行

来实现。
db.Entry(db.Organizations
  .First(x => OrganizationId == viewModel.OrganizationId))
  .CurrentValues.SetValues(yourViewModel);

yourViewModel - 可以是您要更新的具有一组属性的任何对象,因此您不需要重复代码,但必须为每个操作设置特定的视图模型。您甚至可以在本地使用更新方法并自动执行它,但它必须只包含您要更新的属性。