다음을 통해 공유


데이터 서비스 업데이트(WCF Data Services)

WCF Data Services 클라이언트 라이브러리를 사용하여 Open Data Protocol(OData) 피드를 사용하는 경우 라이브러리에서 피드의 항목을 클라이언트 데이터 서비스 클래스의 인스턴스로 변환합니다. 이러한 데이터 서비스 클래스는 DataServiceQuery이 속한 DataServiceContext를 사용하여 추적됩니다. 클라이언트는 DataServiceContext의 메서드를 사용하여 사용자가 보고하는 엔터티의 변경 내용을 추적합니다. 클라이언트는 이러한 메서드를 사용하여 추가된 엔터티와 삭제된 엔터티를 추적하고 속성 값 또는 엔터티 인스턴스 간의 관계에 대한 변경 내용도 추적할 수 있습니다. 이렇게 추적된 변경 내용은 SaveChanges 메서드를 호출할 때 REST 기반 작업으로 데이터 서비스에 전송됩니다.

Dd756361.note(ko-kr,VS.100).gif참고:
DataServiceCollection의 인스턴스를 사용하여 데이터를 컨트롤에 바인딩하는 경우 바인딩된 컨트롤의 데이터에 대한 변경 내용이 DataServiceContext에 자동으로 보고됩니다. 자세한 내용은 컨트롤에 데이터 바인딩(WCF Data Services)을 참조하십시오.

엔터티 추가, 수정 및 변경

Visual Studio의 서비스 참조 추가 대화 상자를 사용하여 OData 피드에 대한 참조를 추가하면 결과로 생성된 각 클라이언트 데이터 서비스 클래스에는 null을 허용하지 않는 각 엔터티 속성에 대해 매개 변수 하나를 사용하는 정적 Create 메서드가 있습니다. 다음 예제와 같이 이 메서드를 사용하여 엔터티 형식 클래스 인스턴스를 만들 수 있습니다.

' Create the new product.
Dim newProduct = _
    Product.CreateProduct(0, "White Tea - loose", False)
// Create the new product.
Product newProduct =
    Product.CreateProduct(0, "White Tea - loose", false);

엔터티 인스턴스를 추가하려면 다음 예제와 같이 서비스 참조 추가 대화 상자에서 생성된 DataServiceContext 클래스의 해당 AddTo 메서드를 호출합니다.

' Add the new product to the Products entity set.
context.AddToProducts(newProduct)
// Add the new product to the Products entity set.
context.AddToProducts(newProduct);

이렇게 하면 컨텍스트와 올바른 엔터티 집합에 개체가 추가됩니다. AddObject를 호출할 수도 있지만 대신 엔터티 집합 이름을 제공해야 합니다. 추가한 엔터티에 다른 엔터티와의 관계가 하나 이상 있는 경우 AddRelatedObject 메서드를 사용하거나 이전 메서드 중 하나를 사용하고 해당 링크를 명시적으로 정의할 수 있습니다. 이러한 작업에 대해서는 이 항목의 뒷부분에서 설명합니다.

기존 엔터티 인스턴스를 수정하려면 다음 예제와 같이 먼저 해당 엔터티에 대해 쿼리하고 해당 속성을 원하는 대로 변경한 다음 DataServiceContextUpdateObject 메서드를 호출하여 해당 개체의 업데이트를 보내야 한다고 클라이언트 라이브러리에 알립니다.

' Mark the customer as updated.
context.UpdateObject(customerToChange)
// Mark the customer as updated.
context.UpdateObject(customerToChange);

엔터티 인스턴스를 삭제하려면 다음 예제와 같이 DataServiceContextDeleteObject 메서드를 호출합니다.

' Mark the product for deletion.    
context.DeleteObject(deletedProduct)
// Mark the product for deletion.    
context.DeleteObject(deletedProduct);

자세한 내용은 방법: 엔터티 추가, 수정 및 삭제(WCF Data Services)를 참조하십시오.

엔터티 연결

클라이언트 라이브러리를 사용하면 먼저 쿼리를 실행하여 엔터티를 DataServiceContext로 로드하지 않고 엔터티 업데이트를 저장할 수 있습니다. AttachTo 메서드를 사용하여 DataServiceContext의 특정 엔터티 집합에 기존 개체를 연결합니다. 그런 다음 개체를 수정하고 변경 내용을 데이터 서비스에 저장할 수 있습니다. 다음 예제에서는 변경된 고객 개체가 컨텍스트에 연결된 다음 SaveChanges가 호출되기 전에 UpdateObject가 호출되어 연결된 개체를 Modified로 표시합니다.

' Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer)
context.UpdateObject(customer)

' Send updates to the data service.
context.SaveChanges()
// Attach the existing customer to the context and mark it as updated.
context.AttachTo("Customers", customer);
context.UpdateObject(customer);

// Send updates to the data service.
context.SaveChanges();

개체를 연결할 때는 다음 사항을 고려해야 합니다.

  • 개체는 Unchanged 상태로 연결됩니다.

  • 개체를 연결할 때 연결되는 개체와 관련된 개체는 연결되지 않습니다.

  • 엔터티가 컨텍스트에서 이미 추적되고 있는 경우에는 개체를 연결할 수 없습니다.

  • etag 매개 변수를 사용하는 AttachTo 메서드 오버로드는 eTag 값과 함께 받은 엔터티 개체를 연결할 때 사용됩니다. 이 eTag 값은 연결된 개체의 변경 내용을 저장할 때 동시성을 확인하는 데 사용됩니다.

자세한 내용은 방법: DataServiceContext에 기존 엔터티 연결(WCF Data Services)을 참조하십시오.

관계 링크 만들기 및 수정

AddObject 메서드나 서비스 참조 추가 대화 상자에서 생성되는 DataServiceContext 클래스의 해당 AddTo 메서드를 사용하여 새 엔터티를 추가하는 경우 새 엔터티와 관련 엔터티 간의 관계가 자동으로 정의되지 않습니다.

엔터티 인스턴스 간의 관계를 만들고 변경할 수 있으며 클라이언트 라이브러리에서 이러한 변경 사항을 데이터 서비스에 반영하도록 지정할 수 있습니다. 엔터티 간의 관계는 모델에서 연결로 정의되며 DataServiceContext는 각 관계를 컨텍스트의 링크 개체로 추적합니다. WCF Data Services 에서는 이러한 링크를 만들고 수정 및 삭제할 수 있도록 DataServiceContext 클래스에 대해 다음 메서드를 제공합니다.

메서드 설명

AddRelatedObject

관련된 두 엔터티 개체 간에 새 링크를 만듭니다. 이 메서드를 호출하는 것은 AddObjectAddLink를 호출하여 새로운 개체를 만들고 기존 개체에 대한 관계를 정의하는 것과 같습니다.

AddLink

관련된 두 엔터티 개체 간에 새 링크를 만듭니다.

SetLink

관련된 두 엔터티 개체 간의 기존 링크를 업데이트합니다. SetLink는 0 또는 일대일(0..1:1) 및 일대일(1:1) 카디널리티의 링크를 삭제하는 데 사용됩니다. 관련 개체를 null로 설정하여 링크를 업데이트할 수 있습니다.

DeleteLink

SaveChanges 메서드가 호출될 때 컨텍스트에서 추적 중인 링크를 삭제하도록 표시합니다. 관련 개체를 삭제하거나 먼저 기존 개체에 대한 링크를 삭제한 후 새 관련 개체에 대한 링크를 추가하여 관계를 변경할 때 이 메서드를 사용합니다.

AttachLink

두 엔터티 개체 간의 기존 링크를 컨텍스트에 알립니다. 컨텍스트에서는 이 관계가 데이터 서비스에 이미 있다고 간주하고 SaveChanges 메서드가 호출될 때 링크를 만들지 않습니다. 개체를 컨텍스트에 연결하고 둘 사이의 링크도 연결해야 하는 경우 이 메서드를 사용합니다. 새 관계를 정의하는 경우 AddLink를 대신 사용해야 합니다.

DetachLink

컨텍스트에서 지정된 링크 추적을 중지합니다. 이 메서드는 일대다( *:*) 관계를 삭제하는 데 사용됩니다. 1의 카디널리티를 가진 관계 링크의 경우 SetLink를 대신 사용해야 합니다.

다음 예제에서는 AddRelatedObject 메서드를 사용하여 기존 Orders 엔터티와 관련된 새 Order_Detail을 추가하는 방법을 보여 줍니다. 이제 새 Order_Details 개체가 DataServiceContext에서 추적되므로 추가한 Order_Details 개체와 기존 Products 엔터티 간의 관계는 AddLink 메서드를 호출하여 정의됩니다.

' Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem)

' Since the item is now tracked by the context,
' set just the link to the related product.
context.AddLink(selectedProduct, "Order_Details", newItem)
// Add the new item with a link to the related order.
context.AddRelatedObject(order, "Order_Details", newItem);

// Since the item is now tracked by the context,
// set just the link to the related product.
context.AddLink(selectedProduct, "Order_Details", newItem);

AddLink 메서드가 데이터 서비스에 만들어야 하는 링크를 정의하여 이러한 링크가 컨텍스트에 있는 개체에 반영되도록 하지만, 개체 자체의 탐색 속성은 사용자가 직접 설정해야 합니다. 위 예제에서는 다음과 같이 탐색 속성을 설정해야 합니다.

' Add the new order detail to the collection, and
' set the reference to the product.
order.Order_Details.Add(newItem)
newItem.Order = order
newItem.Product = selectedProduct
// Add the new order detail to the collection, and
// set the reference to the product.
order.Order_Details.Add(newItem);
newItem.Order = order;
newItem.Product = selectedProduct;

자세한 내용은 방법: 엔터티 관계 정의(WCF Data Services)를 참조하십시오.

변경 내용 저장

변경 내용이 DataServiceContext 인스턴스에서 추적되기는 하지만 서버로 즉시 전송되지는 않습니다. 지정한 작업에 대해 필요한 변경을 모두 마치면 SaveChanges를 호출하여 모든 변경 내용을 데이터 서비스에 전송합니다. 자세한 내용은 데이터 서비스 컨텍스트 관리(WCF Data Services)를 참조하십시오. BeginSaveChangesEndSaveChanges 메서드를 사용하여 변경 내용을 비동기적으로 저장할 수도 있습니다. 자세한 내용은 비동기 작업(WCF Data Services)을 참조하십시오.

참고 항목

개념

데이터 서비스 쿼리(WCF Data Services)
비동기 작업(WCF Data Services)
일괄 처리 작업(WCF Data Services)
개체 구체화(WCF Data Services)
데이터 서비스 컨텍스트 관리(WCF Data Services)

기타 리소스

WCF Data Services 클라이언트 라이브러리