2011-01-05 15 views
1

私は本当に "問題"はありませんでしたが、私はこのコードを実際にうまく開発しない方法を見つけました。エンティティフレームワークでエンティティを更新するより良い方法はありますか?

私は私の国コントローラ(編集方法)(WebUIの層)があります。あなたが見ることができるように、私が使用して、実際に

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

そして、私の検証サービス(ドメイン層)私の国のエンティティ(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; 
    } 
関連する問題