2010-01-11 1 views
0

WCF Data Services를 사용하는 Silverlight 응용 프로그램이 있습니다. 로깅 기능을 추가하려고합니다. 새 행이 생성되면이 새 행의 기본 키가 로깅 테이블에도 기록됩니다. 행 생성 및 로깅은 동일한 트랜잭션 내에서 발생해야합니다. 기본 키는 데이터베이스를 통해 생성됩니다 (IDENTITY 키워드 사용).Silverlight의 ADO.NET 데이터 서비스 : 동일한 트랜잭션 내에서 생성 된 키 사용

예를 들어 설명하는 것이 가장 적절할 수 있습니다. 여기서 새로운 고객 행을 만들고 같은 트랜잭션에서 고객의 기본 키를 AuditLog 행에 작성합니다.

using (var ts = new TransactionScope()) 
    { 
     AuditTestEntities entities = new AuditTestEntities(); 
     Customer c = new Customer(); 
     c.CustomerName = "Acme Pty Ltd"; 
     entities.AddToCustomer(c); 
     Debug.Assert(c.CustomerID == 0); 
     entities.SaveChanges(); 
     // The EntityFramework automatically updated the customer object 
     // with the newly generated key 
     Debug.Assert(c.CustomerID != 0); 
     AuditLog al = new AuditLog(); 
     al.EntryDateTime = DateTime.Now; 
     al.Description = string.Format("Created customer with customer id {0}", c.CustomerID); 
     entities.AddToAuditLog(al); 
     entities.SaveChanges(); 
     ts.Complete(); 
    } 

엔티티 프레임 워크를 사용하여 두꺼운 클라이언트를 개발할 때 그것은 사소한 문제입니다 :이 예는 두꺼운 클라이언트와 엔티티 프레임 워크를 사용합니다.

그러나, 사용 실버 라이트와 ADO.NET 데이터 서비스 : 비동기

  • SaveChanges를 만 호출 할 수 있습니다
  • 나는 키를 생성하는 경우
  • 는 잘 모르겠어요 TransactionScope에 사용할 수있는 확실하지 않다 클라이언트에 반영 될 수 있습니다. 편집 : Alex James에 따르면 실제로 클라이언트에 반영됩니다.

이렇게해도 될까요?

답변

4

짧은 답변 : 없음이 그렇게 ...

좋아도 할 수 없습니다 :

  1. 생성 된 키는 클라이언트에 반영됩니다.
  2. DataServiceContext를 사용하여 하나의 SaveChanges 작업을 처리 할 수 ​​있습니다. SaveChanges (SaveChangesOption.Batch)

을하지만 불행하게도 당신은 다른 사람의 반응에 하나 개의 요청을 묶어 하나의 트랜잭션 내에서 둘 다 포장 아무것도 할 수 없습니다. 그러나

...

당신이 AuditLog 보고서에서 파생되는 CustomerAuditLog 방법함으로써 모델을 변경하는 경우 :

// Create and insert customer ... 
// Create audit log and relate to un-insert customer 
CustomerAuditLog al = new CustomerAuditLog(); 
al.EntryDateTime = DateTime.Now; 
al.Description = string.Format("Created customer with {Customer.ID}"); 
// assuming your entities implement INotifyPropertyChanging and you are using 
// the Data Services Update to .NET 3.5 SP1 to use DataServiceCollection 
// to notify the DataServiceContext that a relationship has been formed. 
// 
// If not you will manually need to tell Astoria about the relationship too. 
al.Customer = c; 
entities.AddToAuditLog(al); 
entities.SaveChanges(); 

을 그리고 깊은 당신의 기본 데이터 소스 또는 어쩌면 데이터베이스 로직의 일종을 가지고 {Customer.ID}를 적절한 값으로 바꿉니다.

동일한 트랜잭션에서 두 개의 삽입이 발생하고 하나 (CustomerAuditLog)가 다른 (Customer)에 종속되는 경우 기본 데이터 소스에서 적절히 정렬해야하기 때문에 작동하게 할 수 있습니다.

그러나이 접근법이 일종의 해킹임을 알 수 있듯이 가능한 각 감사 메시지의 유형을 원하지 않습니다! 그리고 ... 작동하지 않을 수도 있습니다.

희망이

Alex

데이터 서비스 팀, 마이크로 소프트

을하는 데 도움이