2011-07-12 5 views
0

find()メソッドを使用して1つのレコードを返します。これは、要約として表示するレコードを返します。また、viewmodelは、顧客がプロジェクトで使用したメトリックを視覚的に特定できるようにします。それらのメトリックを使用しなかった場合は、値をゼロに更新できます。メトリックを更新したら、[保存]をクリックして、これらのメトリックを表に挿入します。だから私が最初に見つけたのは、計画メトリクスのステータスが「計画済み」で、メトリックが「メトリクス」テーブルから取り込まれていたということです。これらのメトリックをページにロードすると、必要に応じてこれらのメトリックが新しい値で更新され、status = 'Actual'の新しい行として再挿入されます。エンティティエラー4.1 ObjectStateManager - オブジェクトキーマネージャに同じキーが既に存在しています

オリジナル計画メトリック記録 - METRICID = 1、metricstatus = 新実際metircsレコード 'を計画' - ノーIDを挿入する前に、metricstatus = '実際の'

私は、挿入時に次のエラーを取得します。

同じキーを持つオブジェクトがすでにObjectStateManagerに存在しています。 ObjectStateManagerは、同じキーを持つ複数のオブジェクトを追跡できません。これは、私は、レコード

IList<Metric> MetricList = new List<Metric>(); 

foreach (var projectMetric in ProjectMetrics){ 
    if (projectMetric.MetricTypeId != 0) 
    { 
     var metric = new Metric 
     { 
      Value = Int32.Parse(projectMetric.Value), 
      MetricTypeId = projectMetric.MetricTypeId, 
      ProjectId = project.ProjectId, 
      MetricPhase = "Actual" 

     }; 

     project.Metrics.Add(metric); 

    } 
} 

を挿入これは私が変更

this.Context.Projects.Attach(project); 
this.Context.Entry(project).State = System.Data.EntityState.Modified; 

this.Context.SaveChanges(); 

を保存する方法がどのようにあるすべてのヘルプは大歓迎です。


public Project GetProjectByID(int? id) 
     { 
      Project ProjectQuery = Context.Projects.Find(id); 

      return ProjectQuery; 

     } 

私は実際にすべてのメトリックを持つサーバーにjson文字列を返します。私はjsonの文字列を次のように逆シリアル化します。


List InsertableProjectMetrics = JsonConvert.DeserializeObject>(metricsJSON);

次に、JasonメトリックデータをループするInsertMetricMethodを呼び出します。



public void InsertProjectMetrics(List ProjectMetrics, int projectid, ref Project project, string Status) 
     { 
      //Insert Record: Insert New Record 
      try 
      { 
       this.Context.Projects.Attach(project); 

       foreach (var projectMetric in ProjectMetrics) 
       { 
        if (projectMetric.MetricTypeId != 0) 
        { 
         var metric = new Metric 
         { 
          Value = Int32.Parse(projectMetric.Value), 
          MetricTypeId = projectMetric.MetricTypeId, 
          ProjectId = project.ProjectId, 
          MetricPhase = "Actual" 
         }; 

         project.Metrics.Add(metric); 

        } 
       }
+0

どのように 'project'を取得しましたか? DBから、または生のエンティティを作成しましたか? – Nix

答えて

0

あなたはproject.Metricsに新しいmetricを追加し、コンテキストにprojectを添付する際に間違っているため。

projectMetricsコレクションには、ID = 0のメトリックが多数あります。このグラフをコンテキストEFに添付すると、プロジェクトとすべての子コレクションがUnchanged状態になります。例外はIDを持つ複数のインスタンスがあることを訴える= 0

この行を呼び出す必要があり、問題を解決するために...あなたは、foreachループを開始する前に、

this.Context.Projects.Attach(project) 
... と添付のMetricsコレクションに新しいメトリックを追加してください。project EF変更検出は、自動的にそれらを新しい子として認識し、コンテキストに状態Addedを入れます。 Added州では、重複IDの使用が許可されています(主キーがデータベースID列である限り)。このエラーに直面したときに

+0

私はこの変更を行ったので、次のようになりました: - >ストアの更新、挿入、または削除のステートメントが予期しない行数(0)に影響を与えました。エンティティはロードされた後に変更または削除された可能性があります。 ObjectStateManagerエントリを更新します。 – Keith

+0

@Nate:状態を 'Modified'に設定する行はまだありますか?はいの場合は、行を削除してもう一度やり直してください。 (あるいは、同時に 'project'にいくつかのスカラープロパティがありますか?)エラーが残っている場合は' project'から 'SaveChanges'までの全コードを表示してください。 – Slauma

+0

変更を取り消す取得エントリを更新中にエラーが発生しました。詳細については、内部例外を参照してください。私は主な質問 – Keith

1

言及物事の下に確認してください。

  1. データベーステーブルを挿入する場合、データ型の主キーを持つ、uniqueidentitiferを、その後、同様の後ろにコード内で主キー列の値を設定します。例えば。RequestId = Guid.NewGuid();イベント0125プライマリ・キーは、SQL function newid()を使用して挿入ストアド・プロシージャ内に移入されています。
  2. データベーステーブルの行を更新するときは、プライマリキーの列の値をコードに設定しないでください。代わりに、行wrtを主キー列の値に更新します。