У меня есть класс:
class User
{
IDictionary<Post, DateTime> SavedPosts { get; set; }
}
Это сохраняется в табличной ассоциации «многие ко многим» [Пользователь] - <[Сохраняет]> - [Запись]
Таблица [Сохранения]:
ID_USER (int)
ID_POST (int)
SAVED_ON (DateTime)
Отображение выглядит так:
<map name="SavedPosts" table="[SAVES]">
<key column="ID_USER" />
<index-many-to-many column="ID_POST" class="Post" />
<element column="SAVED_ON" />
</map>
Если я сделаю это:
User u = db.Get<User>(1); //get user with ID = 1
Post p = db.Load<Post>(5); //load post with ID = 5
//Let's say I know that the post #5 is saved
DateTime savedon = u.SavedPosts[p];
Nhibernate выполняет:
SELECT ID_USER, SAVED_ON, ID_POST FROM [SAVES] WHERE ID_USER = 1
но ... Если у пользователя есть как 100 000 сохраненных сообщений ??!?! Я не хочу получать все это.
Так что я могу сделать что-то вроде этого:
db.CreateQuery(@"select s
from User u
join u.SavedPosts s
where u.ID = :userId
and s.index = :postId")
.SetInt32("userId", u.ID)
.SetInt32("postId", p.ID)
.UniqueResult<DateTime>();
И все работает нормально.
Но как я могу обновить или вставить SavedPosts? Каждый раз, когда я «что-то делаю» на IDictionary SavedPosts, он загружает все данные (посмотрите на приведенный выше оператор SQL) из базы данных.
«Сделай что-нибудь» означает:
u.SavedPosts[p] = DateTime.Now; //for update
u.SavedPosts.Add(p, DateTime.Now); //for insert
Итак, результат, которым я был бы доволен:
- Одно попадание в базу данных, которое получает одну без записи из таблицы SAVES,
- Если я получаю запись, я обновляю ее,
- Если я не получаю запись, я вставляю.
Как я могу это сделать?