web-dev-qa-db-fra.com

Entity Framework ne sauvegarde pas les modifications

J'ai une application Web MVC qui utilise SQL Server 2008 en tant que base de données principale avec Entity Framework. L'application fonctionne très bien et extrait très bien les données de la base de données. Mon problème est, quand il fait une mise à jour des données, il ne semble pas l'enregistrer. J'utilise la fonction suivante:

    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
        {
            context.Products.Add(product);
        }

        context.SaveChanges(); // Breakpoint here
    }

Cette fonction est définie dans mon code de référentiel. J'ai défini un point d'arrêt sur la ligne commentée ci-dessus et l'application se rompt au niveau de la ligne. Je sais donc qu'elle frappe cette ligne et que les modifications sont correctes dans l'objet contextuel. Aucune erreur ne se produit, EF ne sauvegarde pas les modifications pour une raison quelconque.

Je crois que ma chaîne de connexion est correcte, car elle extrait très bien les données, mais ici, c'est juste au cas où:

<connectionStrings>
    <add name="EFDbContext" connectionString="Data Source=localhost;Initial Catalog=WarehouseStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient"/>
</connectionStrings>

Quelqu'un a une idée sur ce qui pourrait causer cela?

16
Icemanind

Si vous recherchez la fonctionnalité insertion/mise à jour, vous devez couvrir les deux cas suivants:

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

Grâce à @veblok, j'ai trouvé la solution à mon problème . Il existe une option dans la classe DbContext pour empêcher EF de suivre un objet par défaut . Une fois supprimé, EF a commencé à se comporter comme prévu.

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

vous pouvez utiliser la méthode Create de contexte: utilisez cette méthode généralement lorsque vous avez une entité associée

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
}
2
HamidReza

J'ai eu le même problème. context.Entry(product).State = EntityState.Modified; m'a donné une erreur. La solution intéressante consiste à utiliser DbSetMigrationsExtensions.AddOrUpdate(), méthode . Cette méthode fait partie de DbSetMigrationExtensions et vous devez spécifier l'espace de nom suivant pour pouvoir utiliser cette méthode d'extension:

using System.Data.Entity.Migrations;

public void SaveProduct(Product product)
    {
        context.Set<Product>().AddOrUpdate(product);

        context.SaveChanges();
    }
0
mirushaki