我很難搞清楚如何更新我的實體及其相關數據。使用惰性加載..更新複雜的模型綁定EF5 ASP.NET MVC4
我有以下實體模型
public class Config
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int32 Id { get; set; }
[Required]
[MaxLength(100)]
public String Name { get; set; }
public virtual IList<DataField> DataFields { get; set; }
}
public class DataField
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Int32 Id { get; set; }
[ForeignKey("Config")]
public Int32 ConfigId { get; set; }
public virtual Config Config { get; set; }
[Required, MaxLength(1000)]
public String Name { get; set; }
}
與相應的視圖模型。我已將它們刪除,刪除驗證等。
public class ConfigViewModel
{
public Int32 Id { get; set; }
public String Name { get; set; }
public IList<DataFieldViewModel> DataFields { get; set; }
public ConfigModel()
{
DataFields = new List<DataFieldViewModel>();
}
}
public class DataFieldViewModel
{
[Required]
public Int32 Id { get; set; }
public String Name { get; set; }
}
在我Edit.cshtml形式我動態地添加新的數據域,當我發帖的形式,他們得到適當的deserialised到ConfigViewModel.DataFields。只要一切正常, 但是,我如何轉換這些模型,並更新實體模型? 如果我發佈新的數據字段,他們的ID將爲0,他們應該被添加,但已經有一個ID,應該更新.. 我不知道如何做到這一點,並且找不到任何東西相關的,或者我能理解的。
我在ConfigController中有以下內容。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(ConfigViewModel model)
{
try
{
if (!ModelState.IsValid)
return View();
var config = uow.Repository<Entity.Models.Config>().FindById(model.Id);
config.Name = model.Name;
// Do something with the datafields
// config.DataFields
uow.Repository<Entity.Models.Config>().Edit(config);
uow.Save();
return RedirectToAction("Index");
}
catch(Exception ex)
{
ModelState.AddModelError("Error", ex.Message);
return View(model);
}
}
在我的倉庫,我有:
public void Edit(TEntity entity)
{
var entry = Context.Entry<TEntity>(entity);
entry.State = EntityState.Modified;
}
我Edit.cshtml形式看起來像
@for(var i = 0; i < Model.DataFields.Count; i++)
{
<tr>
<td>@Html.HiddenFor(m => m.DataFields[i].Id)</td>
<td>@Html.TextBoxFor(m => m.DataFields[i].Name)</td>
<td>@Html.EnumDropDownListFor(m => m.DataFields[i].Type)</td>
</tr>
}