NHibernate域模型-将子对象添加到集合

NHibernate域模型-将子对象添加到集合,nhibernate,contains,Nhibernate,Contains,我还在这里学习,对儿童收藏有疑问。我有一个名为Audio的聚合根,它有一个AudioDownloads集合 下载是下载音频的每个IP地址的记录,我不希望每个音频都有相同IP的重复记录 在我的域中,我具有以下功能: public virtual void Add(AudioDownload download) { if (!AudioDownloads.Contains(download)) { TotalDownloads++;

我还在这里学习,对儿童收藏有疑问。我有一个名为Audio的聚合根,它有一个AudioDownloads集合

下载是下载音频的每个IP地址的记录,我不希望每个音频都有相同IP的重复记录

在我的域中,我具有以下功能:

 public virtual void Add(AudioDownload download)
    {
        if (!AudioDownloads.Contains(download)) {
            TotalDownloads++;
            AudioDownloads.Add(download);
        }
    }
var download = new AudioDownload();
audio.Add(download);
这就是我调用Add函数的方式:

 public virtual void Add(AudioDownload download)
    {
        if (!AudioDownloads.Contains(download)) {
            TotalDownloads++;
            AudioDownloads.Add(download);
        }
    }
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不添加重复的条目,我应该这样做吗

多谢各位


Paul

我希望大多数方法都会让您查询数据库中的所有下载,这可能不是您想要的

另一种可能更便宜的方法是在数据库中定义一个基于AudioId和Ip的唯一密钥。如果您随后插入一条与这些内容重复的记录,您将从NHibernate获得一个异常,告诉您违反了唯一密钥:优雅地处理该异常(即,不要将其显示为错误,加载现有音频下载并在将来使用),我相信您将实现您的目标

使用此方法时,不要检查下载是否已包含在集合中,因为这仍然会触发加载所有记录


另一方面:如果看到某个东西从同一个Ip上被下载了多次,那不是很有趣吗

为什么要手动执行Contains()检查元素是否已包含,而不是对集合使用ISet(这将自动执行)?您好,我已尝试将其设置为ISet,但它仍允许我添加重复条目。我的实体有3个属性-Id-Audio-DateTime属性是否会使每次下载都是唯一的,或者如果我没有在该属性上使用[DomainSignature]过滤器,它是否应该忽略这一点?PaulI认为您需要覆盖AudioDownload classI上的equals,因为DomainSignature筛选器已经为您执行了此操作,这是s#arp框架的一部分。我相信它们覆盖了equals和hashcode。在我调用域上的AudioDownloads.Add()方法之前,我只需检查服务层中的数据库中是否存在该项。我之所以要这样做,是为了保留每个音频的唯一下载总数。有没有其他办法来解决这种情况。我还有一个单独的实体,名为AudioDownloadsByser,它不记录IP,而是在登录时记录用户Id。他们都是从AudioHit继承的。AudioHit-AudioDownloadByIp-AudioDownloadByUser我将调查ISet&你的方法,将公布我的发现。谢谢大家!如果您希望每个IP上有唯一的下载,您还可以编写一个“独特的”查询来计算这个数字。另一方面:IP并不能保证总是由同一个人使用。一些互联网提供商在不同的时间点不给他们的用户相同的IP,因此结果的价值可能不会那么高(你对登录用户的方法更可靠)…我意识到,我知道这不会是100%,不幸的是,我还需要对未登录的成员进行计数。我正在使用会话、Cookies和IP地址的组合来尽可能地缩小它的范围。谢谢你的提醒!