NHibernate, возможно, не сможет обновить mail_subscriptions
, как вы показали выше, но он может сделать это за одну поездку в БД с помощью пакетных запросов.
В этом примере рассматривается Subscriptions
сопоставленный как HasMany
с использованием Component
, хотя примерно такой же метод можно использовать, если сопоставление было просто равным HasMany
. Я также предполагаю, что у каждого пользователя уже есть строки в таблице mail_subscriptions
для каждого списка рассылки, установленного на false
для subscribed
.
public class User{
public virtual string Id {get; set;}
public virtual IList<MailSubscription> Subscriptions {get; set;}
}
public class MailSubscription{
public virtual int ListId {get; set;}
public virtual bool Subscribed {get; set;}
}
public void UpdateSubscriptions(string userid, int[] mailingListIds){
var user = session.Get<User>(userid);
foreach(var sub in
user.Subscriptions.Where(x=> mailingListIds.Contains(x.ListId))){
sub.Subscribed=true;
}
session.Update(user);
}
Теперь, когда единица работы завершится, вы должны увидеть, как SQL, полученный таким образом, отправляется в одну поездку в БД.
update mail_subscriptions set subscribed=true where user_id='me' and listid=21
update mail_subscriptions set subscribed=true where user_id='me' and listid=14
update mail_subscriptions set subscribed=true where user_id='me' and listid=15
update mail_subscriptions set subscribed=true where user_id='me' and listid=19