Impossible d'enregistrer des modifications avec Entity Framework dans un projet ASP.Net MVC 3

asp.net-mvc-3 c# ef-code-first entity-framework savechanges

Question

Étudier asp.net mvc 3 + code EF en premier. Je suis nouveau aux deux. Mon exemple est trivial, mais je ne peux toujours pas le faire fonctionner. Manquer quelque chose de simple et évident ...

J'ai un cours:

 public class Product
 {
    [HiddenInput(DisplayValue = false)]
    public int ProductID { get; set; }

    [Required(ErrorMessage = "Please enter a product name")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a description")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
    public decimal Price { get; set; }

    [Required(ErrorMessage = "Please specify a category")]
    public string Category { get; set; }
}

et un DbContext :

public class EFDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

et un référentiel:

public class EFProductRepository : IProductRepository
{
    private EFDbContext context = new EFDbContext();

    public IQueryable<Product> Products
    {
        get
        {
            return context.Products;
        }
    }

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

        context.SaveChanges();
    }
}

Le contrôleur MVC:

public class AdminController : Controller
{
    private IProductRepository repository;

    public AdminController(IProductRepository repo)
    {
        repository = repo;
    }

    public ViewResult Index()
    {
        return View(repository.Products);
    }

    public ViewResult Edit(int productId)
    {
        Product product = repository.Products.FirstOrDefault(p => p.ProductID == productId);
        return View(product);
    }

    [HttpPost]
    public ActionResult Edit(Product product)
    {
        if (ModelState.IsValid)
        {
            repository.SaveProduct(product);
            TempData["message"] = string.Format("{0} has been saved", product.Name);
            return RedirectToAction("Index");
        }
        else
        {
            // there is something wrong with the data values
            return View(product);
        }
    }
}

Cela me permet de voir la liste des produits, d’ouvrir la vue d’édition, de tout valider en fonction de l’ensemble des attributs ...

Lorsque SaveChanges() modifications validées, il passe à la méthode Http Post Edit et effectue la SaveChanges() nécessaire.

Il ne jette aucune exception, il continue et me redirige vers la liste des produits.

L'élément modifié reste inchangé.

La base de données sous-jacente (connectée via connectionstrings dans web.config ) reste également inchangée.

Réponse acceptée

Vous devez attacher l'instance d'entité créée en dehors de EF et indiquer à EF qu'elle a été modifiée.

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
    {
        context.Products.Add(product);
    }
    else
    {
        context.Products.Attach(product);
        context.Entry(product).State = EntityState.Modified;
    }

    context.SaveChanges();
}

Réponse populaire

Vous devez Attach les instances du Product au contexte avant SaveChanges

public void SaveProduct(Product product)
{
    if (product.ProductID == 0)
        context.Products.Add(product);
    else
    {    
        context.Products.Attach(product);
        context.Entry(product).State = EntityState.Modified;
    }
    context.SaveChanges();
}


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow