在我看来,在使用下面的实体框架删除它之前我必须检索一个对象
var customer = context.Customers.First(c => c.Id == 1);
context.DeleteObject(customer);
context.Savechanges();
所以我需要两次点击数据库。有更简单的方法吗?
答案 0 :(得分:72)
在Entity Framework 6中,删除操作为Remove
。这是一个例子
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();
答案 1 :(得分:51)
与@Nix相同,只需稍加改动即可进行强类型化:
如果您不想查询它,只需创建一个实体,然后将其删除。
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.DeleteObject(customer);
context.SaveChanges();
答案 2 :(得分:23)
类似问题here。
使用实体框架,有EntityFramework-Plus(扩展库) 可在NuGet上使用。然后你可以写下这样的东西:
// DELETE all users which has been inactive for 2 years
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2))
.Delete();
它对批量删除也很有用。
答案 3 :(得分:22)
如果您不想查询它,只需创建一个实体,然后将其删除。
Customer customer = new Customer() { Id = 1 } ;
context.AttachTo("Customers", customer);
context.DeleteObject(customer);
context.Savechanges();
答案 4 :(得分:5)
我在我的一个项目中使用以下代码:
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项目中使用此代码。]
答案 5 :(得分:2)
原始的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.
}
}
答案 6 :(得分:2)
此答案实际上取自Scott Allen的名为ASP.NET MVC 5基础知识的课程。我想分享一下,因为它比这里的任何答案都更简单,更直观。还要注意,根据Scott Allen和我所做的其他培训,find方法是从数据库中检索资源的一种优化方法,如果已经检索到该资源,则可以使用缓存。在此代码中,集合是指对象的DBSet。对象可以是任何通用对象类型。
var object = context.collection.Find(id);
context.collection.Remove(object);
context.SaveChanges();
答案 7 :(得分:0)
如果您使用的是EF 1.0,那么这是最简洁的方法。可能还有其他方式,但他们比恕我直言更麻烦。
答案 8 :(得分:0)
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();