Entity Framework 4.1: как удалить идентификатор объекта - PullRequest
30 голосов
/ 05 августа 2011

Я хотел бы знать, как удалить объект из Entity Framework 4.1 без предварительной загрузки объекта из базы данных. Я нашел эти другие 2 ответа о переполнении стека, но они не относятся к EF 4.1

Я попробовал следующий код, но он не работает

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

Я хочу избежать кода ниже.

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

И я не хочу вызывать хранимую процедуру или выполнять raw sql.

Ответы [ 4 ]

40 голосов
/ 16 августа 2011

Я использую следующее для своих удалений, прекрасно работает.

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());
}

enter image description here

10 голосов
/ 16 августа 2011

Просто чтобы убедить вас, что ваш первый фрагмент кода должен работать, вот простой пример, который вы можете скопировать, вставить и протестировать:

  • Создание нового проекта консольного приложения (.NET 4)
  • Добавить ссылку на EntityFramework.dll (EF 4.1)
  • Удалите содержимое Program.cs и вставьте следующее:

->

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

Если у вас есть БД SQL Server Express, она автоматически создаст БД.

Возможно, это может помочь вам сравнить с вашим кодом, потому что похоже, что что-то невидимое в ваших фрагментах кода вызывает другое поведение, которое вы описываете.

3 голосов
/ 05 августа 2011

использовать заглушки:

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

справка:

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

0 голосов
/ 31 июля 2015

Следующий код хорошо работает для меня:

var c = db.Set<T>().Find(id);
db.Entry(c).State = EntityState.Deleted;
db.SaveChanges();

Если этот объект ранее не отслеживался DbContext, он попадал бы в базу данных, в противном случае он находил бы его в памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...