2012-03-04 8 views
12

エンティティフレームワークと共にSQL Server 2008をバックエンドデータベースとして使用するMVC Webアプリケーションがあります。アプリケーションは正常に動作しており、データベースからデータを引き上げるだけです。私の問題は、データの更新を行うと、保存されていないように見えるということです。私は以下の関数を使用しています:エンティティフレームワークで変更が保存されない

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 

     context.SaveChanges(); // Breakpoint here 
    } 

この関数はマイレポジトリコードで定義されています。私は上記のコメント行にブレークポイントを設定し、アプリケーションはその行で壊れているので、その行が当たっていることを知っていて、変更はコンテキストオブジェクト内ですべてうまくいきます。エラーは発生せず、EFは単に何らかの理由で変更を保存していません。

<connectionStrings> 
    <add name="EFDbContext" connectionString="Data Source=localhost;Initial Catalog=WarehouseStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/> 
</connectionStrings> 

誰もがこれを引き起こす可能性がどのように任意のアイデアを持っている:

私は私の接続文字列は、そのだけで罰金データを引っ張っているので、正確であるが、ここでは念のためであると考えていますか?

+0

SQL Serverに対して実行していると仮定して:-) SQLプロファイラを有効にして、EFがDBにクエリを送信しているかどうかを確認してください。すべてのセーブチェンジが完了する前に、EFからのプロファイラのログインエントリがあるはずです。 –

+0

'context.Products.Add(product);を打つのをチェックしましたか?そうでなければ何も保存されていません。 – veblock

+0

@ Ricky.G - 良いアイデア、私はそれを試してみる – Icemanind

答えて

32

あなたが挿入/更新機能の後にある場合は、両方のケースをカバーする必要があります。

あなたはコンテキストのメソッドを作成して使用することができます
if (product.ProductID == 0) 
{ 
    context.Entry(product).State = EntityState.Added; 
} 
else 
{ 
    context.Entry(product).State = EntityState.Modified; 
} 
context.SaveChanges(); 
+0

この変更は私の問題を修正しました!ありがとう! – Icemanind

+1

EFがこれを知っていないという理由はありますか?結局私はaddメソッドを呼び出しました。既存の編集で動作します – Chad

+2

既存のものを編集すると、まずEFから取得するので、EFはオブジェクトの状態を追跡します。新しいオブジェクトを追加するときは、オブジェクトをEFの外に作成します。したがって、オブジェクトを追加するときに、追加するように明示的にEFに指示する必要があります。 – veblock

2

:あなたは、関連するエンティティを持っている場合、一般的に

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      product = context.Products.Create(); 
      product.property = ...; 
      product.property = ...; 

      context.Products.Add(product); 
    } 

    context.SaveChanges(); // Breakpoint here 
} 
を、このメソッドを使用します
3

@veblokのおかげで、私は自分の問題を解決しました。 DbContextクラスには、EFがデフォルトでオブジェクトを追跡するのを防ぐオプションがあります。 EFが削除されると、期待どおりに動作し始めました。

public class My Context : DbContext { 
    public MyContext() 
    { 
     // REMOVE this or use veblok's solution 
     this.Configuration.AutoDetectChangesEnabled = false;    
    } 
    ... 
} 
+0

'AutoDetectChangesEnabled'プロパティは、読み取り専用クエリのパフォーマンス(およびメモリフットプリント)を大幅に向上させることができます。複雑な読み取りを行っているメソッドの中で単純な更新を行っているだけの場合は、更新用の新しいデータコンテキストを作成することができます –

関連する問題