다음을 통해 공유


방법: 데이터베이스에서 행 삭제

해당 LINQ to SQL 개체를 테이블 관련 컬렉션에서 제거하여 데이터베이스의 행을 삭제할 수 있습니다. LINQ to SQL은 변경 내용을 적절한 SQL DELETE 명령으로 변환합니다.

LINQ to SQL은 계단식 삭제 작업을 지원하거나 인식하지 않습니다. 테이블에 대한 제약 조건이 있는 행을 삭제하려면 다음 작업 중 하나를 완료해야 합니다.

  • 데이터베이스의 외래 키 제약 조건에서 ON DELETE CASCADE 규칙을 설정합니다.

  • 사용자 고유의 코드를 사용하여 먼저 부모 개체가 삭제되지 않도록 하는 자식 개체를 삭제합니다.

그렇지 않으면 예외가 발생합니다. 이 항목의 뒷부분에 있는 두 번째 코드 예제를 참조하세요.

비고

Insert, UpdateDelete 데이터베이스 작업에 대한 LINQ to SQL 기본 메서드를 재정의할 수 있습니다. 자세한 내용은 삽입, 업데이트 및 삭제 작업 사용자 지정을 참조하세요.

Visual Studio를 사용하는 개발자는 개체 관계형 디자이너를 사용하여 동일한 용도로 저장 프로시저를 개발할 수 있습니다.

다음 단계에서는 유효한 DataContext가 Northwind 데이터베이스에 연결되어 있다고 가정합니다. 자세한 내용은 방법: 데이터베이스연결.을 참조하세요.

데이터베이스에서 행을 삭제하려면

  1. 데이터베이스에서 삭제할 행을 쿼리합니다.

  2. DeleteOnSubmit 메서드를 호출합니다.

  3. 데이터베이스에 변경 사항을 제출합니다.

예제 1

이 첫 번째 코드 예제에서는 주문 #11000에 속하는 주문 세부 정보를 데이터베이스에 쿼리하고, 이러한 주문 세부 정보를 삭제하도록 표시하고, 이러한 변경 내용을 데이터베이스에 제출합니다.

// Query the database for the rows to be deleted.
var deleteOrderDetails =
    from details in db.OrderDetails
    where details.OrderID == 11000
    select details;

foreach (var detail in deleteOrderDetails)
{
    db.OrderDetails.DeleteOnSubmit(detail);
}

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e);
    // Provide for exceptions.
}
' Query the database for the rows to be deleted.
Dim deleteOrderDetails = _
    From details In db.OrderDetails() _
    Where details.OrderID = 11000 _
    Select details

For Each detail As OrderDetail In deleteOrderDetails
    db.OrderDetails.DeleteOnSubmit(detail)
Next

Try
    db.SubmitChanges()
Catch ex As Exception
    Console.WriteLine(ex)
    ' Provide for exceptions
End Try

예제 2

이 두 번째 예제에서는 주문을 제거하는 것입니다(#10250). 코드는 먼저 OrderDetails 테이블을 검사하여 제거할 순서에 자식이 있는지 확인합니다. 주문이 자식을 포함하는 경우, 먼저 자식이 제거 대상으로 표시되고 그 다음에 주문이 제거 대상으로 표시됩니다. DataContext 데이터베이스로 전송된 삭제 명령이 데이터베이스 제약 조건을 준수하도록 실제 삭제를 올바른 순서로 배치합니다.

Northwnd db = new Northwnd(@"c:\northwnd.mdf");

db.Log = Console.Out;

// Specify order to be removed from database
int reqOrder = 10250;

// Fetch OrderDetails for requested order.
var ordDetailQuery =
    from odq in db.OrderDetails
    where odq.OrderID == reqOrder
    select odq;

foreach (var selectedDetail in ordDetailQuery)
{
    Console.WriteLine(selectedDetail.Product.ProductID);
    db.OrderDetails.DeleteOnSubmit(selectedDetail);
}

// Display progress.
Console.WriteLine("detail section finished.");
Console.ReadLine();

// Determine from Detail collection whether parent exists.
if (ordDetailQuery.Any())
{
    Console.WriteLine("The parent is present in the Orders collection.");
    // Fetch Order.
    try
    {
        var ordFetch =
            (from ofetch in db.Orders
             where ofetch.OrderID == reqOrder
             select ofetch).First();
        db.Orders.DeleteOnSubmit(ordFetch);
        Console.WriteLine($"{ordFetch.OrderID} OrderID is marked for deletion.");
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.ReadLine();
    }
}
else
{
    Console.WriteLine("There was no parent in the Orders collection.");
}

// Display progress.
Console.WriteLine("Order section finished.");
Console.ReadLine();

try
{
    db.SubmitChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    Console.ReadLine();
}

// Display progress.
Console.WriteLine("Submit finished.");
Console.ReadLine();
Dim db As New Northwnd("c:\northwnd.mdf")

db.Log = Console.Out
' Specify order to be removed from database.
Dim reqOrder As Integer = 10252

' Fetch OrderDetails for requested order.
Dim ordDetailQuery = _
From odq In db.OrderDetails _
Where odq.OrderID = reqOrder _
Select odq

For Each selectedDetail As OrderDetail In ordDetailQuery
    Console.WriteLine(selectedDetail.Product.ProductID)
    db.OrderDetails.DeleteOnSubmit(selectedDetail)
Next

' Display progress.
Console.WriteLine("Detail section finished.")
Console.ReadLine()

' Determine from Detail collection whether parent exists.
If ordDetailQuery.Any Then
    Console.WriteLine("The parent is present in the Orders collection.")
    ' Fetch order.
    Try
        Dim ordFetch = _
        (From ofetch In db.Orders _
         Where ofetch.OrderID = reqOrder _
         Select ofetch).First()

        db.Orders.DeleteOnSubmit(ordFetch)
        Console.WriteLine("{0} OrderID is marked for deletion.,", ordFetch.OrderID)

    Catch ex As Exception
        Console.WriteLine(ex.Message)
        Console.ReadLine()
    End Try

Else
    Console.WriteLine("There was no parent in the Orders collection.")

End If


' Display progress.
Console.WriteLine("Order section finished.")
Console.ReadLine()

Try
    db.SubmitChanges()

Catch ex As Exception
    Console.WriteLine(ex.Message)
    Console.ReadLine()

End Try

' Display progress.
Console.WriteLine("Submit finished.")
Console.ReadLine()

참고하십시오