web-dev-qa-db-ja.com

Entity Frameworkが変更を保存しない

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>

誰がこれを引き起こす可能性があるのか​​について何か考えがありますか?

20
Icemanind

挿入/更新機能を使用している場合は、両方のケースをカバーする必要があります。

if (product.ProductID == 0)
{
    context.Entry(product).State = EntityState.Added;
}
else
{
    context.Entry(product).State = EntityState.Modified;
}
context.SaveChanges();
36
veblock

@veblokのおかげで、問題の解決策を見つけました。 DbContextクラスには、EFがデフォルトでオブジェクトを追跡しないようにするオプションがあります。削除すると、EFは期待どおりに動作し始めました。

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

コンテキストの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
}
2
HamidReza

私の問題は少し異なりました。私のモデルでは、DBがキーを割り当てると言っていましたが、実際にはそれをコントローラーで作成して渡していました。以下の行をコメントアウトすると、すべてが機能し始めました:

enter image description here

これに遭遇するかもしれない他の人に幸運を祈ります。見つけるのはバガーでした!

0
flashsplat

私も同じ問題を抱えていました。 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();
    }
0
mirushaki