답변:
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 : { '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();
더 작은 버전 (이전 버전과 비교시) :
var customer = context.Find(id);
context.Delete(customer);
context.SaveChanges();
이 답변은 실제로 ASP.NET MVC 5 Fundamentals라는 Scott Allen의 과정에서 가져온 것입니다. 나는 이미 여기에있는 어떤 대답보다 약간 더 간단하고 직관적이라고 생각하기 때문에 공유하겠다고 생각했습니다. 또한 Scott Allen 및 내가 수행 한 다른 교육에 따르면 find 메서드는 이미 검색된 경우 캐싱을 사용할 수있는 데이터베이스에서 리소스를 검색하는 최적화 된 방법입니다. 이 코드에서 컬렉션은 개체의 DBSet을 나타냅니다. 개체는 모든 일반 개체 유형이 될 수 있습니다.
var object = context.collection.Find(id);
context.collection.Remove(object);
context.SaveChanges();