当我使用Ria Services在Silverlight中保存实体时,将删除该实体在数据库中的所有多对多关系。
服务器接收的实体在属性中具有相同的值,但所有列表都为空。当nHiberante保存实体时,它会删除所有多对多的关系。
在某些情况下,有没有办法阻止nHiberante更新多对多的关系? (我已将该属性的映射设置为延迟加载)
是否有可以添加到实体或属性的属性,以便它可以更好地与Ria一起使用?
我正在使用Silverlight 4和Ria以及nHiberante 3 alpha。
答案 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);
}