我没有真正的“问题”,但我发现我开发此代码的方式并不是很好。
我有我的国家/地区控制器(编辑方法)(WebUI图层):
[HttpGet]
public ActionResult Edit(int id)
{
var country = _groupsRepository.getCountryById(id);
Mapper.CreateMap<Country, CountriesEditViewModel>();
CountriesEditViewModel viewModel = Mapper.Map<Country, CountriesEditViewModel>(country);
return View(viewModel);
}
//
// POST: /CountriesAdmin/Edit/5
[HttpPost]
public ActionResult Edit(int id, CountriesEditViewModel viewModel)
{
try
{
if (ModelState.IsValid)
{
Mapper.CreateMap<CountriesEditViewModel, Country>();
Country country = Mapper.Map<CountriesEditViewModel, Country>(viewModel);
country.Name = IntranetTools.UppercaseFirst(country.Name.Trim());
country.ISOCode = country.ISOCode.ToLower();
_countryValidationService.UpdateCountry(country);
}
}
catch (RulesException ex)
{
ex.CopyTo(ModelState);
}
if (ModelState.IsValid)
return RedirectToAction("Index");
else return View(viewModel);
}
我的验证服务(域层):
public void UpdateCountry(Country country)
{
EnsureValidForUpdate(country);
// UPDATE
var countryToUpdate = _groupsRepository.getCountryById(country.CountryId);
countryToUpdate.CountryId = country.CountryId;
countryToUpdate.Name = country.Name;
countryToUpdate.ISOCode = country.ISOCode;
_groupsRepository.SaveChanges();
}
实际上,正如您所看到的,我使用Automapper来映射我的国家实体(实体框架)和我的视图模型。 我使用验证服务进行验证并将我的对象(如果没有错误)更新到数据库。事实是我觉得我必须通过它的Id从DB中获取我的对象来保存这个对象。我认为可能有更好的解决方案来更新我的对象(因为我不想为我的对象映射所有字段并且每次都从DB获取Country)
var countryToUpdate = _groupsRepository.getCountryById(country.CountryId);
countryToUpdate.CountryId = country.CountryId;
countryToUpdate.Name = country.Name;
countryToUpdate.ISOCode = country.ISOCode;
_groupsRepository.SaveChanges();
有没有更好的解决方案来保存我的对象与实体Framwork或我别无选择?
谢谢!
答案 0 :(得分:1)
通常,您可以在不从DB加载对象的情况下更新对象,但必须知道其ID。
您的更新功能如下:
public void UpdateCountry(Country country)
{
EnsureValidForUpdate(country);
_objectContext.Attach(country);
ObjectStateEntry entry = _objectContext.ObjectStateManager.GetObjectStateEntry(country);
entry.SetModifiedProperty("Name");
entry.SetModifiedProperty("ISOCode");
_objectContext.SaveChanges();
}
我没有使用您的存储库,而是使用了ObjectContext实例。此代码要求您的Country实例设置了Id,Name和ISOCode。更新将仅在Name和ISOCode字段上完成。
但我必须提到我不是这样使用的。当您开始使用复杂的实体和关系时,首先加载实体是EF中更好的方法。
答案 1 :(得分:0)
您可以循环调用此方法。然后循环调用context.SaveChanges();
public void UpdateCountry(Item updateItem)
{
context.YourDbObjects.Attach(updateItem);
DbEntityEntry<Item> entry = context.Entry(updateItem);
entry.State = EntityState.Modified;
}