Подтвердить что ты не робот

Entity Framework не сохраняет изменения

У меня есть веб-приложение 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>

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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
}