2011-07-16 11 views
0

TerminalCertificationエンティティを更新するリポジトリに更新機能があります。しかし、このエンティティは、他のクラス(GomrokJustification)との関係が多岐にわたります。
私の更新機能はエンティティを正しく更新しますが、関連するエンティティは更新しません。エンティティ・フレームワーク内の関連するデータを更新する

public void UpdateTerminalCertification(TerminalCertification terminalCertification) 
    { 
     var lastCertification = 
      db.terminalCertifications.Include("TimeInfo").Include("GomrokJustifications").Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID).ToList(); 
     if (lastCertification.Count==0) 
      throw new TerminalCertificationNotFoundException(terminalCertification); 
     terminalCertification.TimeInfo = lastCertification[0].TimeInfo; 
     ((IObjectContextAdapter)db).ObjectContext.Detach(lastCertification[0]); 
     ((IObjectContextAdapter)db).ObjectContext.AttachTo("terminalCertifications", terminalCertification); 
     foreach (var gomrokJustification in terminalCertification.GomrokJustifications) 
     { 
      ((IObjectContextAdapter)db).ObjectContext.AttachTo("gomrokJustifications", gomrokJustification); 
      ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.ChangeObjectState(gomrokJustification, EntityState.Modified); 
     } 
     ((IObjectContextAdapter) db).ObjectContext.ObjectStateManager.ChangeObjectState(terminalCertification,EntityState.Modified); 
    } 

と私のTerminalCetrificationは、いくつかのエンティティによって以前に充填したGomrokJustificationsのリストを持っています 私の更新機能は以下の通りです。私はそれらの最後のエンティティを新しいものに置き換えたい。しかし、これは起こらなかった。 誰にも分かりますか?

答えて

1

の代わりに、このやって:

var lastCertification = db.terminalCertifications 
          .Include("TimeInfo") 
          .Include("GomrokJustifications") 
          .Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID) 
          .FirstOrDefault(); 
if (lastCertification == null) 
    throw new TerminalCertificationNotFoundException(terminalCertification); 

コレクション内の要素がない場合、最初は例外をスローし、あなたが気にしない場合:あなたはちょうどこの操作を行うことができ

var lastCertification = db.terminalCertifications 
          .Include("TimeInfo") 
          .Include("GomrokJustifications") 
          .Where(item=>item.TerminalCertificationID==terminalCertification.TerminalCertificationID) 
          .ToList(); 

if (lastCertification.Count==0) 
    throw new TerminalCertificationNotFoundException(terminalCertification); 

を端末証明書は、そのカスタム例外を削除することさえできないことを意味します。あなたのロジックは返されたリストに要素が1つしかないと仮定しているので、Single()を使用することさえできます。これは、Tolistを呼び出して最初のアイテムを取得する場合に比べて、達成したいことをより多く表します。

  1. あなたのコードを慎重に見た後、私は実際にあなたがここで達成しようとしているポイントを取得していません。最初に既存の端末認証エンティティがあります。次に、その最初のクエリで再度取得します。なぜですか?次に、概念的には同じエンティティからtimeinfoを取得します(idで取得したため)、入力パラメータとして取得したエンティティに渡します。なぜデータベースから取得したもので作業を続けないのですか?次に、受け取ったエンティティをデータベースから切り離します。なぜですか?そして、入力端末認証で作業を続けます。 http://msdn.microsoft.com/en-us/library/bb896271.aspx

は、私たちは一緒にあなたを助けるために、いくつかのより多くの情報が必要になるでしょう:私はあなたがApplyCurrentValuesを見て、取り外して、ここでオブジェクトをアタッチするエンティティの状態などについてのエンティティフレームワークドキュメントにもっと慎重にビットを見てする必要があると思います。

関連する問題