2011-01-05 3 views
1

"문제"가 아니라 실제로이 코드를 개발하는 방법을 찾았습니다. 당신이 볼 수 있듯이, 내가 사용,엔티티 프레임 워크로 엔티티를 업데이트하는 더 좋은 방법이 있습니까?

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(); 

    } 

사실 :

[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); 
    } 

그리고 내 검증 서비스 (도메인 층) :

나는 내 나라 컨트롤러 (편집 방법) (웹 UI 층)가 내 국가 엔티티 (Entity Framework)와 내 뷰 모델을 매핑하는 오토 맵퍼. 유효성 검사를하고 데이터베이스에 내 개체 (오류가없는 경우)를 업데이트하는 유효성 검사 서비스를 사용합니다. 사실은이 객체를 저장하기 위해 ID를 사용하여 객체를 DB에서 가져와야한다고 생각합니다. 나는

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

저장하는 더 나은 솔루션 거기에 (내가 때마다 내 개체의 모든 필드를 매핑 및 DB에서 국가를 얻을 싶지 않기 때문에) 내 개체를 업데이트 할 수있는 더 나은 솔루션이 어쩌면이 있다고 생각 엔티티 Framwork과 내 개체 또는 나는 선택의 여지가 없어?

감사합니다.

답변

1

일반적으로 DB에서로드하지 않고 개체를 업데이트 할 수 있지만 ID를 알아야합니다. 나는 당신의 저장소를 사용하지 않는 대신에 내가 ObjectContext는 인스턴스를 사용

public void UpdateCountry(Country country)  
{   
    EnsureValidForUpdate(country); 
    _objectContext.Attach(country); 

    ObjectStateEntry entry = _objectContext.ObjectStateManager.GetObjectStateEntry(country); 
    entry.SetModifiedProperty("Name"); 
    entry.SetModifiedProperty("ISOCode"); 

    _objectContext.SaveChanges();  
} 

: 같은

귀하의 업데이트 기능을 볼 수있다. 이 코드에서는 Country 인스턴스가 Id, Name 및 ISOCode를 설정해야합니다. 업데이트는 이름 및 ISOCode 필드에서만 수행됩니다.

하지만이 방법을 사용하지 않는다는 것을 언급해야합니다. 엔티티를 먼저로드하는 것은 복잡한 엔티티 및 관계로 작업하기 시작할 때 EF에서 훨씬 더 나은 접근 방식입니다.

+0

고맙습니다. 나는이 방법을 몰랐다. 사실, DB에서 먼저로드하고 싶지 않았습니다. 왜냐하면 더 많은 자원을 사용한다고 생각했기 때문입니다. – Areasta

0

이 메서드는 루프로 호출 할 수 있습니다. 다음 루프 호출 후 context.SaveChanges();

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

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

     entry.State = EntityState.Modified; 
    } 
관련 문제