Модель домена NHibernate - Добавление дочерних объектов в коллекции - PullRequest
0 голосов
/ 17 декабря 2009

Я все еще учусь здесь и у меня есть вопрос о дочерних коллекциях. У меня есть объединенный корень под названием Audio, в котором есть коллекция AudioDownloads.

Загрузки представляют собой записи каждого IP-адреса, с которого загружается аудио, я не хочу, чтобы для каждого аудио были дублированные записи одного и того же IP-адреса.

В моем домене у меня есть следующая функция:

 public virtual void Add(AudioDownload download)
    {
        if (!AudioDownloads.Contains(download)) {
            TotalDownloads++;
            AudioDownloads.Add(download);
        }
    }

И вот как я вызываю функцию Add:

var download = new AudioDownload();
audio.Add(download);

Это возвращает все загрузки из базы данных для этого аудио (которых может быть тысячи!), Также оно все еще добавляет загрузку, даже если она уже существует.

Я использую S # arp с подходом DomainSignature для сравнения моих сущностей.

Вот мой домен:

public class AudioDownload : Entity, ITenantSpecific
{
    public AudioDownload() { DateAdded = DateTime.Now; }

    [DomainSignature]
    public virtual Audio Audio { get; set; }

    [DomainSignature]
    public virtual string Ip { get; set; }

    public virtual DateTime DateAdded { get; set; }
}

У меня вопрос ... даже если я могу заставить AudioDownloads не добавлять повторяющиеся записи, я должен вообще так делать?

Большое спасибо!

Пол

1 Ответ

1 голос
/ 17 декабря 2009

Я ожидаю, что большинство способов сделать это всегда заставит вас запрашивать все загрузки из базы данных, что, вероятно, не то, что вы хотите.

Другой подход, который может быть дешевле, - это просто иметь уникальный ключ в базе данных, определенный на основе AudioId и Ip. Если вы затем вставите запись, которая дублирует их, вы получите исключение из NHibernate, сообщающее, что уникальный ключ был нарушен: обработайте это исключение изящно (то есть не показывайте его как ошибку, загрузите существующую AudioDownload и используйте ее в будущем) и я верю, что ты достиг своей цели.

При использовании этого подхода не проверяйте, содержится ли загрузка в коллекции, так как это все равно приведет к загрузке всех записей.

С другой стороны: не было бы интересно увидеть, что что-то загружалось с одного и того же Ip несколько раз?

...