[entity-framework] 엔티티 프레임 워크를 사용하여 ID로 객체를 삭제하는 방법

아래와 같이 엔티티 프레임 워크로 삭제하기 전에 객체를 검색해야하는 것 같습니다.

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();