簡體   English   中英

實體框架不保存更改

[英]Entity Framework not saving changes

我有一個 MVC Web 應用程序,它使用 SQL Server 2008 作為后端數據庫以及實體框架。 該應用程序運行良好,從數據庫中提取數據也很好。 我的問題是,當它更新數據時,它似乎沒有保存它。 我正在使用以下功能:

    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;            
  }
  ...
 }

您可以使用上下文的創建方法:當您有相關實體時,通常使用此方法

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();
    }

我的問題略有不同。 我的模型說數據庫正在分配密鑰,但我實際上是在我的控制器中創建它並傳遞它。 我注釋掉了下面的行,一切都開始工作了:

在此處輸入圖片說明

祝其他可能遇到這種情況的人好運。 是個笨蛋!

確保你的表有一個主鍵。

如果是這樣,您將在 dbcontext 中找到這一行

entity.HasNoKey();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM