Есть ли лучший способ обновить мои сущности с помощью Entity Framework? - PullRequest
1 голос
/ 05 января 2011

У меня нет особых проблем, но я нашел способ разработки этого кода не очень хорошо.

У меня есть контроллер стран (метод редактирования) (слой 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 для сопоставления моей сущности Country (Entity Framework) и моей модели представления. Я использую службу проверки, которая выполняет проверку и обновляет мой объект (если нет ошибок) в базе данных. Дело в том, что я чувствую, что должен получить свой объект из БД по его идентификатору, чтобы сохранить этот объект. Я думаю, что, возможно, есть лучшее решение для обновления моего объекта (потому что я не хочу отображать все поля для своих объектов и каждый раз получать страну из БД)

        var countryToUpdate = _groupsRepository.getCountryById(country.CountryId);
        countryToUpdate.CountryId = country.CountryId;
        countryToUpdate.Name = country.Name;
        countryToUpdate.ISOCode = country.ISOCode;
        _groupsRepository.SaveChanges();

Есть ли лучшее решение для сохранения моих объектов с помощью Framwork или у меня нет выбора?

Спасибо!

Ответы [ 2 ]

1 голос
/ 05 января 2011

Как правило, вы можете обновить ваш объект, не загружая его из БД, но вы должны знать его идентификатор.

Ваша функция обновления может выглядеть следующим образом:

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, когда вы начинаете работать со сложными сущностями и отношениями.

0 голосов
/ 30 июля 2017

Вы можете вызвать этот метод в цикле.Затем после вызова цикла context.SaveChanges ();

    public void UpdateCountry(Item updateItem)     
    {         
        context.YourDbObjects.Attach(updateItem);

        DbEntityEntry<Item> entry = context.Entry(updateItem);

        entry.State = EntityState.Modified;
    } 
...