Entity Framework не сохраняет изменения - PullRequest
17 голосов
/ 05 марта 2012

У меня есть веб-приложение MVC, которое использует SQL Server 2008 в качестве внутренней базы данных вместе с Entity Framework.Приложение работает нормально и просто извлекает данные из базы данных.Моя проблема в том, что когда он обновляет данные, он, похоже, не сохраняет их.Я использую следующую функцию:

    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>

У кого-нибудь есть идеи, что может вызвать это?

Ответы [ 4 ]

35 голосов
/ 05 марта 2012

Если вы используете функции вставки / обновления, вы должны охватить оба случая:

if (product.ProductID == 0)
{
    context.Entry(product).State = EntityState.Added;
}
else
{
    context.Entry(product).State = EntityState.Modified;
}
context.SaveChanges();
4 голосов
/ 26 августа 2016

Благодаря @veblok я нашел решение своей проблемы.В классе DbContext есть опция, позволяющая EF отслеживать объект по умолчанию.После удаления EF начал вести себя как ожидалось.

 public class My Context : DbContext {
  public MyContext()
  {
        // REMOVE this or use veblok's solution
        this.Configuration.AutoDetectChangesEnabled = false;            
  }
  ...
 }
2 голосов
/ 26 ноября 2015

вы можете использовать метод создания контекста: обычно используйте этот метод, когда у вас есть связанный объект

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
}
0 голосов
/ 01 октября 2018

У меня была такая же проблема.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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...