Entity Frameworkとともに、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>
誰がこれを引き起こす可能性があるのかについて何か考えがありますか?
挿入/更新機能を使用している場合は、両方のケースをカバーする必要があります。
if (product.ProductID == 0)
{
context.Entry(product).State = EntityState.Added;
}
else
{
context.Entry(product).State = EntityState.Modified;
}
context.SaveChanges();
@veblokのおかげで、問題の解決策を見つけました。 DbContextクラスには、EFがデフォルトでオブジェクトを追跡しないようにするオプションがあります。削除すると、EFは期待どおりに動作し始めました。
public class My Context : DbContext {
public MyContext()
{
// REMOVE this or use veblok's solution
this.Configuration.AutoDetectChangesEnabled = false;
}
...
}
コンテキストのCreateメソッドを使用できます。通常、関連エンティティがある場合にこのメソッドを使用します
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
}
私も同じ問題を抱えていました。 context.Entry(product).State = EntityState.Modified;
でエラーが発生しました。興味深い解決策は、DbSetMigrationsExtensions.AddOrUpdate()
メソッドを使用することです。このメソッドはDbSetMigrationExtensionsの一部であり、この拡張メソッドを使用するには、次の名前空間を指定する必要があります。
using System.Data.Entity.Migrations;
public void SaveProduct(Product product)
{
context.Set<Product>().AddOrUpdate(product);
context.SaveChanges();
}