实体框架不保存更改

Ice*_*ind 18 c# sql-server-2008 entity-framework-4.1 asp.net-mvc-3

我有一个MVC Web应用程序,它使用SQL Server 2008作为后端数据库以及实体框架.应用程序运行正常,从数据库中提取数据就好了.我的问题是,当它对数据进行更新时,它似乎没有保存它.我正在使用以下功能:

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

        context.SaveChanges(); // Breakpoint here
    }
Run Code Online (Sandbox Code Playgroud)

此功能在我的存储库代码中定义.我在上面评论的行上设置了一个断点,应用程序在该行处断开,所以我知道它击中该行并且上下文对象中的更改都很好.没有错误发生,EF根本就没有保存更改.

我相信我的连接字符串是正确的,因为它提取数据很好,但在这里它是以防万一:

<connectionStrings>
    <add name="EFDbContext" connectionString="Data Source=localhost;Initial Catalog=WarehouseStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

任何人都有任何想法可能会导致这种情况?

veb*_*ock 36

如果您在插入/更新功能之后,则必须涵盖以下两种情况:

if (product.ProductID == 0)
{
    context.Entry(product).State = EntityState.Added;
}
else
{
    context.Entry(product).State = EntityState.Modified;
}
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

  • 当您编辑现有的一个时,首先从EF获取它,因此EF跟踪对象的状态.当你添加一个新对象时,你在EF之外创建对象,因此当你添加它时,你必须明确告诉EF添加它. (2认同)

Ste*_*eri 6

感谢@veblok,我找到了问题的解决方案。默认情况下,DbContext 类中有一个选项可以防止 EF 跟踪对象。删除后,EF 开始按预期运行。

 public class My Context : DbContext {
  public MyContext()
  {
        // REMOVE this or use veblok's solution
        this.Configuration.AutoDetectChangesEnabled = false;            
  }
  ...
 }
Run Code Online (Sandbox Code Playgroud)

  • `AutoDetectChangesEnabled` 属性可以极大地提高只读查询的性能(和内存占用) - 因此,如果您在代码库中发现了这一点,请不要在不检查的情况下将其删除。如果您只是在执行复杂读取的方法中进行简单的更新,那么您可能需要为更新创建一个新的数据上下文 (2认同)