繁体   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