我有一个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>
任何人对可能导致这种情况的人有任何想法吗?
答案 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)
答案 5 :(得分:-2)
确保你的表有一个主键。
如果是这样,你会在 dbcontext 中找到这一行
entity.HasNoKey();