我有一个实体:
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
。
帮帮我:)
答案 0 :(得分:0)
如果创建的视图模型仅包含此视图编辑的OrganizationId和Name属性,则可以通过执行
来实现。db.Entry(db.Organizations
.First(x => OrganizationId == viewModel.OrganizationId))
.CurrentValues.SetValues(yourViewModel);
yourViewModel - 可以是您要更新的具有一组属性的任何对象,因此您不需要重复代码,但必须为每个操作设置特定的视图模型。您甚至可以在本地使用更新方法并自动执行它,但它必须只包含您要更新的属性。