实体框架不保存更改

时间:2012-03-04 21:45:22

标签: c# asp.net-mvc-3 sql-server-2008 entity-framework-4.1

我有一个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>

任何人对可能导致这种情况的人有任何想法吗?

6 个答案:

答案 0 :(得分:35)

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分: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 :(得分:0)

我有同样的问题。 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();
    }

答案 4 :(得分:0)

我的问题略有不同。我的模型说数据库正在分配密钥,但实际上是在控制器中创建它并传递它。我注释掉了下面的行,一切开始正常工作:

enter image description here

对其他可能碰到这一点的人来说真是最好的运气。是个虫子!

答案 5 :(得分:-2)

确保你的表有一个主键。

如果是这样,你会在 dbcontext 中找到这一行

entity.HasNoKey();