有没有更好的方法来更新我的实体与实体框架?

时间:2011-01-05 00:17:07

标签: .net entity-framework asp.net-mvc-2 entity

我没有真正的“问题”,但我发现我开发此代码的方式并不是很好。

我有我的国家/地区控制器(编辑方法)(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或我别无选择?

谢谢!

2 个答案:

答案 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;
    }