0

私はまだここで学んでいて、子コレクションについて質問があります。AudioDownloads のコレクションを持つ Audio という集約ルートがあります。

ダウンロードは、オーディオをダウンロードする各 IP アドレスのレコードです。オーディオごとに同じ IP の重複したレコードを持ちたくありません。

私のドメインでは、次の機能があります。

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

そして、これは私が Add 関数を呼び出す方法です:

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

これは、このオーディオのデータベースからすべてのダウンロードを返します (数千になるはずです!)。また、ダウンロードが既に存在する場合でも、ダウンロードを追加しています。

エンティティを比較するために DomainSignature アプローチで S#arp を使用しています。

ここに私のドメインがあります:

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で重複したエントリを追加しないようにできたとしても、このようにする必要がありますか?

どうもありがとうございました!

ポール

4

1 に答える 1

1

これを行うほとんどの方法では、常にデータベースからすべてのダウンロードを照会することになると思いますが、これはおそらくあなたが望んでいることではありません。

より安価な別のアプローチは、AudioId と Ip に基づいて定義されたデータベースに一意のキーを保持することです。次に、これらを複製するレコードを挿入すると、NHibernate から例外が発生し、一意のキーが違反されたことを通知されます: その例外を適切に処理します (つまり、エラーとして表示せず、既存の AudioDownload をロードし、将来それを使用します)。あなたはあなたの目標を達成するでしょう、私は信じています。

このアプローチを使用する場合、ダウンロードがコレクションに既に含まれているかどうかを確認しないでください。これは、すべてのレコードの読み込みを引き続きトリガーするためです。

一方で、何かが同じ IP から複数回ダウンロードされているのを見るのは興味深いことではないでしょうか?

于 2009-12-17T15:35:25.673 に答える