Работа с троичными ассоциациями - PullRequest
1 голос
/ 27 октября 2009

У меня есть класс:

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,
  • Если я получаю запись, я обновляю ее,
  • Если я не получаю запись, я вставляю.

Как я могу это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...