2010-12-09 61 views
1

Lorsque je sauvegarde une entité dans Silverlight à l'aide de Ria Services, toutes les relations plusieurs à plusieurs contenues dans la base de données sont supprimées.Enregistrer une entité via Ria Services supprime toutes les relations plusieurs à plusieurs dans la base de données

L'entité que le serveur reçoit a les mêmes valeurs dans les propriétés, sauf que toutes les listes sont vides. Lorsque nHiberante sauve l'entité, elle efface toutes les relations plusieurs à plusieurs.

Existe-t-il un moyen d'empêcher nHiberante de mettre à jour de nombreuses relations dans certaines situations? (Les mappages de cette propriété sont déjà définis sur la charge paresseuse.)

Y a-t-il un attribut que je peux ajouter à l'entité ou à la propriété afin qu'il fonctionne mieux avec Ria? J'utilise Silverlight 4 avec Ria et nHiberante 3 alpha.

Répondre

2

Utilisez-vous l'attribut [Composition] sur vos collections?

Avec RIA, vous avez deux options pour gérer les collections sur un graphe d'objets. Si vous utilisez l'attribut [Composition], ces objets enfants sont uniquement accessibles via l'objet parent. Si vous n'utilisez pas l'attribut [Composition], vous avez besoin de méthodes SEPARATE sur votre DomainService pour gérer l'insertion/la mise à jour/la suppression de ces objets.

À titre d'exemple: Voici une méthode de service dont j'ai sauvegardé les modifications dans un objet Ticket. L'objet Ticket possède une collection d'éléments TicketAction. Ces articles sont déclarés à la [Composition] attribut:

[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; 
    } 
    } 

La méthode de service pour la mise à jour de ces ressemble à ceci:

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

     _ticketDataSource.Update(ticket); 
} 

Pour les nouveaux TicketActions ajouté au billet, il faut associer le billet. TicketId à l'TicketAction.TicketId afin qu'il soit enregistré. Je n'utilise pas NHibernate (nous travaillons ADO.NET contre Oracle, ne demandez pas), mais le point n'est pas le tech; c'est que vous devez obtenir les clés associées correctement. Si vous n'utilisez pas l'attribut [Composition] dans ce type de scénario, vous DEVEZ avoir une méthode Insert et Update distincte pour les objets TicketAction car RIA appellera d'abord ces méthodes, puis appellera la méthode TicketUpdate.

Est-ce que cela a du sens?

0

Une meilleure pratique consiste à utiliser des modèles de présentation pour vos entités Silverlight (Sl) au lieu d'utiliser les entités NHibernate directement sur SL.

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