Answers:
在Entity Framework 6中,删除动作为Remove
。这是一个例子
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();
Attach
呢 为什么不只是Remove
和SaveChanges
?
与@Nix相同,只需要进行少量更改即可进行强类型输入:
如果您不想查询它,只需创建一个实体,然后将其删除。
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.DeleteObject(customer);
context.SaveChanges();
这里有类似的问题。
有了Entity Framework,就有了EntityFramework-Plus(扩展库)。
在NuGet上可用。然后,您可以编写如下内容:
// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Delete();
这对于批量删除也很有用。
我在我的一个项目中使用以下代码:
using (var _context = new DBContext(new DbContextOptions<DBContext>()))
{
try
{
_context.MyItems.Remove(new MyItem() { MyItemId = id });
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
if (!_context.MyItems.Any(i => i.MyItemId == id))
{
return NotFound();
}
else
{
throw ex;
}
}
}
这样,只有在尝试删除具有指定ID的项目时发生异常时,它才会对数据库进行两次查询。然后,如果找不到该项目,它将返回一条有意义的消息;否则,它只会抛出异常(您可以针对不同的异常类型使用不同的catch块,通过使用if块等添加更多自定义检查,从而以更适合您的情况的方式处理此异常)。
[我正在带有Entity Framework Core的MVC .Net Core / .Net Core项目中使用此代码。]
我想原始SQL查询是最快的方法
public void DeleteCustomer(int id)
{
using (var context = new Context())
{
const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}";
var rows = context.Database.ExecuteSqlCommand(query,id);
// rows >= 1 - count of deleted rows,
// rows = 0 - nothing to delete.
}
}
dwkd的答案主要是在Entity Framework核心中为我工作的,除非我看到以下异常:
InvalidOperationException:无法跟踪实体类型“ Customer”的实例,因为已经跟踪了另一个具有相同“ {'Id”}键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用“ DbContextOptionsBuilder.EnableSensitiveDataLogging”来查看冲突的键值。
为避免异常,我更新了代码:
Customer customer = context.Customers.Local.First(c => c.Id == id);
if (customer == null) {
customer = new Customer () { Id = id };
context.Customers.Attach(customer);
}
context.Customers.Remove(customer);
context.SaveChanges();
该答案实际上取自Scott Allen的名为ASP.NET MVC 5基础知识的课程。我想分享一下,因为它比这里的任何答案都更简单,更直观。还要注意,根据Scott Allen和我所做的其他培训,find方法是从数据库中检索资源的一种优化方法,如果已经检索到该资源,则可以使用缓存。在此代码中,集合是指对象的DBSet。对象可以是任何通用对象类型。
var object = context.collection.Find(id);
context.collection.Remove(object);
context.SaveChanges();