Jef*_*eff 90 entity entity-framework
在我看来,我必须在使用下面的实体框架删除它之前检索一个对象
var customer = context.Customers.First(c => c.Id == 1);
context.DeleteObject(customer);
context.Savechanges();
Run Code Online (Sandbox Code Playgroud)
所以我需要两次打数据库.有更简单的方法吗?
dwk*_*wkd 77
在Entity Framework 6中,删除操作是Remove.这是一个例子
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
Saw*_*wan 52
与@Nix相同,只需要进行一些小改动即可进行强类型化:
如果您不想查询它只需创建一个实体,然后将其删除.
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.DeleteObject(customer);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
aca*_*lon 25
类似的问题在这里.
使用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();
Run Code Online (Sandbox Code Playgroud)
它对批量删除也很有用.
Nix*_*Nix 22
如果您不想查询它只需创建一个实体,然后将其删除.
Customer customer = new Customer() { Id = 1 } ;
context.AttachTo("Customers", customer);
context.DeleteObject(customer);
context.Savechanges();
Run Code Online (Sandbox Code Playgroud)
Sha*_*ami 19
从 Entity Framework Core 7 开始,您可以使用以下命令:
await context.Customers.Where(c => c.Id == 1).ExecuteDeleteAsync();
Run Code Online (Sandbox Code Playgroud)
在 EF Core 中,如果您不关心对象是否存在,而只关心它不会在数据库中,那么最简单的是:
context.Remove(new Customer(Id: id)); // adds the object in "Deleted" state
context.SaveChanges(); // commits the removal
Run Code Online (Sandbox Code Playgroud)
您实际上并不需要Attach()- 它将对象添加到状态中的更改跟踪器Unchanged并将Remove()对象添加到状态中的跟踪器Deleted。然而,最重要的是,您只需要与后端进行一次往返。
我在我的一个项目中使用以下代码:
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,只有在尝试删除具有指定ID的项时发生异常时,它才会查询数据库两次.然后,如果找不到该项,则返回有意义的消息; 否则,它只会抛出异常(您可以使用不同的异常类型的不同catch块以更适合您的情况的方式处理它,使用if块添加更多自定义检查等).
[我在具有Entity Framework Core的MVC .Net Core/.Net Core项目中使用此代码.]
这个答案实际上取自 Scott Allen 的课程 ASP.NET MVC 5 Fundamentals。我想我会分享,因为我认为它比这里的任何答案都更简单、更直观。另请注意,根据 Scott Allen 和我做过的其他培训,find 方法是一种从数据库中检索资源的优化方法,如果已经检索,则可以使用缓存。在此代码中,集合指的是对象的 DBSet。对象可以是任何通用对象类型。
var object = context.collection.Find(id);
context.collection.Remove(object);
context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)