아래와 같이 엔티티 프레임 워크로 삭제하기 전에 객체를 검색해야하는 것 같습니다.
var customer = context.Customers.First(c => c.Id == 1);
context.DeleteObject(customer);
context.Savechanges();
그래서 저는 데이터베이스를 두 번 쳐야합니다. 더 쉬운 방법이 있습니까?
답변
Entity Framework 6에서 삭제 작업은 Remove
. 다음은 예입니다.
Customer customer = new Customer () { Id = id };
context.Customers.Attach(customer);
context.Customers.Remove(customer);
context.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();
대량 삭제에도 유용합니다.
답변
쿼리하지 않으려면 항목을 만든 다음 삭제하면됩니다.
Customer customer = new Customer() { Id = 1 } ;
context.AttachTo("Customers", customer);
context.DeleteObject(customer);
context.Savechanges();
답변
내 프로젝트 중 하나에서 다음 코드를 사용하고 있습니다.
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 : { ‘Id’}에 대해 동일한 키 값을 가진 다른 인스턴스가 이미 추적 중이므로 항목 유형 ‘Customer’의 인스턴스를 추적 할 수 없습니다. 기존 엔터티를 연결할 때 지정된 키 값이있는 엔터티 인스턴스가 하나만 연결되었는지 확인합니다. 충돌하는 키 값을 보려면 ‘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();