2010-12-09 16 views
1

當我使用Ria Services將實體保存在silverlight中時,實體在數據庫中的所有多對多關係都將被刪除。通過Ria Services保存實體會刪除數據庫中的所有多對多關係

服務器接收的實體在屬性中具有相同的值,但所有列表均爲空白。當nHiberante保存實體時,它會擦除​​所有多對多關係。

有沒有辦法阻止nHiberante在某些情況下更新多對多關係? (我已經將該屬性的映射設置爲延遲加載)

是否有一個屬性可以添加到實體或屬性中,以便與Ria更好地發揮作用?

我使用Silverlight 4與Ria和nHiberante 3 alpha。

回答

2

您是否在集合上使用[Composition]屬性?

使用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; 
    } 
    } 

更新這些看起來像這樣的服務方法:

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

     _ticketDataSource.Update(ticket); 
} 

對於新TicketActions添加到機票,我們要門票關聯。 TicketId到TicketAction.TicketId,以便它將被保存。我沒有使用NHibernate(我們正在使用ADO.NET對付Oracle;不要問),但重點不在於技術;這是你需要得到正確的關鍵。

如果在此類場景中沒有使用[Composition]屬性,則必須爲TicketAction對象分別使用Insert和Update方法,因爲RIA將首先調用這些方法,然後調用TicketUpdate方法。

這有道理嗎?

0

更好的做法是爲您的Silverlight(SI)實體使用演示模型,而不是直接在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); 
} 
相關問題