Entity Framework 4.1: Как удалить идентификатор объекта
Я хотел бы знать, как удалить объект из Entity Framework 4.1 без предварительной загрузки объекта из базы данных. Я нашел эти другие 2 ответа на Stack Overflow, но они не относятся к 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.
Ответы
Ответ 1
Я использую следующее для своих удалений, отлично работает.
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]()
Ответ 2
Просто, чтобы убедить вас, что ваш первый фрагмент кода должен работать здесь, это простой пример, который вы можете скопировать, вставить и протестировать:
- Создайте новый проект консольного приложения (.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 DB, он автоматически создаст БД.
Возможно, это может помочь вам сравнить с вашим кодом, потому что похоже, что что-то, что не видно в ваших фрагментах кода, вызывает различное поведение, которое вы описываете.
Ответ 3
использовать объекты-заглушки:
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
Ответ 4
Следующий код хорошо работает для меня:
var c = db.Set<T>().Find(id);
db.Entry(c).State = EntityState.Deleted;
db.SaveChanges();
Если этот объект ранее не отслеживался DbContext, он попал бы в базу данных, иначе он найдет его в памяти.