2010-12-09 3 views
1

Ria Services를 사용하여 실버 라이트에 엔티티를 저장하면 엔티티가 데이터베이스에 가지고있는 다 대다 관계가 모두 제거됩니다.Ria Services를 통해 엔티티를 저장하면 데이터베이스의 다 대다 관계가 모두 제거됩니다.

서버가받는 엔터티는 모든 목록이 비어있는 것을 제외하고 속성에서 동일한 값을 갖습니다. nHiberante가 엔티티를 저장하면 많은 관계가 모두 삭제됩니다.

nHiberante가 특정 상황에서 많은 관계를 많은 관계로 업데이트하지 못하도록하는 방법이 있습니까? (해당 속성에 대한 매핑이 이미 지연로드로 설정되어 있습니다.)

엔티티 또는 속성에 추가 할 수있는 속성이있어 Ria에서 더 잘 재생됩니까?

저는 Ria와 nHiberante 3 alpha가 포함 된 Silverlight 4를 사용하고 있습니다.

답변

2

컬렉션에 [구성] 속성을 사용하고 있습니까?

RIA를 사용하면 개체 그래프에서 컬렉션을 처리 할 수있는 두 가지 옵션이 있습니다. [Composition] 속성을 사용하면 해당 하위 객체는 상위 객체를 통해서만 액세스 할 수 있습니다. [Composition] 속성을 사용하지 않는 경우 해당 객체의 삽입/업데이트/삭제를 처리하려면 DomainService에 SEPARATE 메서드가 필요합니다.

예제로 : Ticket 개체에 대한 변경 내용을 저장 한 서비스 메서드는 다음과 같습니다. Ticket 객체에는 TicketAction 항목의 컬렉션이 있습니다. 이러한 항목은 [구성] 속성으로 선언됩니다

[MetadataType(typeof (TicketMetadata))] 
    public partial class Ticket 
    { 
    internal sealed class TicketMetadata 
    { 
     [Key] public int TicketId; 

     [Required] 
     public DateTime IncidentDate; 

     [Include] 
     [Composition] 
     [Association("Ticket_TicketActions", "TicketId", "TicketId")] 
     public List<TicketAction> TicketActions; 
    } 
    } 

같은이 모습을 업데이트하기위한 서비스 방법 : 새 TicketActions를 들어

public void Update(Ticket ticket) 
{ 
     foreach (var ticketAction in ticket.TicketActions) 
     { 
     if (ticketAction.IsNew) 
      ticketAction.TicketId = ticket.TicketId; 
     } 

     _ticketDataSource.Update(ticket); 
} 

이 티켓에 추가, 우리는 티켓을 연결해야합니다. TicketId를 TicketAction.TicketId에 저장하여 저장합니다. 나는 NHibernate를 사용하지 않고있다. (우리는 Oracle에 대해 ADO.NET을 사용하고 있지만 묻지는 않는다.)하지만 요점은 기술이 아니다. 열쇠를 적절하게 연결해야합니다.

이 시나리오에서는 [Composition] 특성을 사용하지 않는 경우 RIA에서 먼저 해당 메서드를 호출하고 TicketUpdate 메서드를 호출하기 때문에 TicketAction 개체에 대해 별도의 Insert 및 Update 메서드가 있어야합니다.

의미가 있습니까?

0

더 나은 방법은 SL에서 직접 NHibernate 엔터티를 사용하는 대신 Silverlight (S1) 엔터티에 대한 프레젠테이션 모델을 사용하는 것입니다.

public void UpdateTicketSl(TicketSl ticketSl) 
{ 
    var ticket = _ticketDataSource.GetById(ticketSl.TicketId); 
    //update ticket entity (Nhibernate entity) using ticketSl (Presentation Model) 
    _ticketDataSource.Update(ticket); 
}