30 votes

Entity Framework 4.1: Comment supprimer par ID d'objet

Je voudrais savoir comment supprimer un objet à partir d'Entity Framework 4.1 sans avoir à charger l'objet à partir de la base de données. J'ai trouvé ces autres 2 réponses sur Stack Overflow, mais ils ne se rapportent pas à 4.1 EF

J'ai essayé le code suivant mais il ne fonctionne pas

public void DeleteCar(int carId)
{
  var car = new Car() { Id = carId };
  _dbContext.Cars.Attach(car);
  _dbContext.Cars.Remove(car);
  _dbContext.SaveChanges();
}

Je veux éviter le code ci-dessous.

public void DeleteCar(int carId)
{
  var car = context.Cars.Find(carId);
  _dbContext.Cars.Remove(car);
  _dbContext.SaveChanges();
}

Et je ne veux pas appeler une procédure stockée ou d'exécuter du sql brut.

40voto

shiznit123 Points 1899

J'utilise ce qui suit pour mes suppressions, fonctionne très bien.

 public virtual ActionResult Delete(int commentID)
{
    var c = new Comment(){CommentID = commentID};
    db.Entry(c).State= EntityState.Deleted;
    db.SaveChanges();
    return RedirectToAction(MVC.Blog.AdminComment.Index());
}
 

entrez la description de l'image ici

10voto

Slauma Points 76561

Juste pour vous convaincre que votre premier extrait de code doit travailler ici est un simple exemple, vous pouvez copier, coller et de test:

  • Créez un nouveau projet application console (.NET 4)
  • Ajouter une référence à l' EntityFramework.dll (EF 4.1)
  • Supprimer le contenu de Program.cs et coller ceci:

->

using System.Data.Entity;

namespace EFDeleteTest
{
    public class Car
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    public class MyContext : DbContext
    {
        public DbSet<Car> Cars { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Database with name "EFDeleteTest.MyContext"
            // will be created automatically in SQL Server Express

            int carId = 0;
            using (var context = new MyContext())
            {
                var car = new Car { Name = "Test" };
                context.Cars.Add(car);
                context.SaveChanges();

                carId = car.Id;
            }
            //Make breakpoint here and check that the car is indeed in the DB

            using (var context = new MyContext())
            {
                var car = new Car() { Id = carId };
                context.Cars.Attach(car);
                context.Cars.Remove(car);
                context.SaveChanges();
            }
            //Make breakpoint here and check that the car
            //indeed has been deleted from DB
        }
    }
}

Si vous avez un Serveur SQL server Express DB va automatiquement créer la DB.

Peut-être cela peut vous aider à comparer avec votre code, car il semble que si quelque chose n'est pas visible dans votre fragments de code est à l'origine des différences de comportement que vous décrivez.

3voto

Milox Points 1983

utiliser des entités de stub:

 public void DeleteCar(int carId)
{
  var car = new Car() { Id = carId };
  _dbContext.AttachTo("Cars",car); 
  _dbContext.DeleteObject(car); 
  _dbContext.SaveChanges();
}
 

référence:

http://blogs.msdn.com/b/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X