Сохранение сущности с помощью Ria Services удаляет все множество связей в базе данных. - PullRequest
1 голос
/ 10 декабря 2010

Когда я сохраняю сущность в silverlight с помощью Ria Services, удаляются все связи «многие ко многим», которые сущность имеет в базе данных.

Объект, который получает сервер, имеет те же значения в свойствах, за исключением того, что все списки пусты. Когда nHiberante сохраняет сущность, она стирает все множество отношений.

Есть ли способ предотвратить обновление nHiberante многих отношений во многих ситуациях? (У меня сопоставления для этого свойства уже установлены на отложенную загрузку)

Есть ли атрибут, который я могу добавить к сущности или свойству, чтобы он лучше играл с Риа?

Я использую Silverlight 4 с Ria и nHiberante 3 alpha.

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Используете ли вы атрибут [Composition] в своих коллекциях?

С RIA у вас есть два варианта для обработки коллекций на графе объектов.Если вы используете атрибут [Composition], то эти дочерние объекты доступны только через родительский объект.Если вы не используете атрибут [Composition], вам понадобятся методы SEPARATE на вашем DomainService для обработки вставки / обновления / удаления этих объектов.

Например: вот мой сервисный метод, который сохраняет изменения в объекте 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 (мы работаем ADO.NET против Oracle; не спрашивайте), но дело не в технологии;это то, что вам нужно правильно связать ключи.

Если вы не используете атрибут [Composition] в сценарии этого типа, тогда вы ДОЛЖНЫ иметь отдельный метод Insert и Update для объектов TicketAction, поскольку RIA сначала вызовет эти методы, а затем вызовет метод TicketUpdate.

Имеет ли это смысл?

0 голосов
/ 08 октября 2013

Лучше использовать модели презентаций для объектов Silverlight (Sl) вместо использования сущностей NHibernate непосредственно на SL.

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