通过Ria Services保存实体会删除数据库中的所有多对多关系

时间:2010-12-09 23:03:49

标签: silverlight nhibernate ria

当我使用Ria Services在Silverlight中保存实体时,将删除该实体在数据库中的所有多对多关系。

服务器接收的实体在属性中具有相同的值,但所有列表都为空。当nHiberante保存实体时,它会删除所有多对多的关系。

在某些情况下,有没有办法阻止nHiberante更新多对多的关系? (我已将该属性的映射设置为延迟加载)

是否有可以添加到实体或属性的属性,以便它可以更好地与Ria一起使用?

我正在使用Silverlight 4和Ria以及nHiberante 3 alpha。

2 个答案:

答案 0 :(得分:2)

您是否在收藏中使用[Composition]属性?

使用RIA,您可以在对象图上处理集合。如果使用[Composition]属性,则只能通过父对象访问这些子对象。如果未使用[Composition]属性,则需要在DomainService上使用SEPARATE方法来处理这些对象的插入/更新/删除。

作为示例:这是我保存的更改Ticket对象的服务方法。 Ticket对象具有TicketAction项的集合。这些项目使用[Composition]属性声明:

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

更新这些内容的服务方法如下所示:

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

      _ticketDataSource.Update(ticket);
}

对于添加到故障单的新TicketActions,我们必须将Ticket.TicketId与TicketAction.TicketId相关联,以便保存它。我没有使用NHibernate(我们正在针对Oracle使用ADO.NET;不要问),但重点不是技术;这是你需要正确关联密钥。

如果您没有在此类场景中使用[Composition]属性,那么您必须为TicketAction对象提供单独的Insert和Update方法,因为RIA将首先调用这些方法,然后调用TicketUpdate方法。

这有意义吗?

答案 1 :(得分:0)

更好的做法是为Silverlight(Sl)实体使用表示模型,而不是直接在SL上使用NHibernate实体。

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