【发布时间】:2009-12-17 15:13:06
【问题描述】:
我仍然在这里学习,并且有一个关于子集合的问题。我有一个名为 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 不添加重复条目,我应该这样做吗?
非常感谢!
保罗
【问题讨论】:
-
你为什么要手动 Contains() 检查元素是否已被包含,而不是使用 ISet 作为集合(它会自动执行此操作)?
-
嗨,我尝试将其设置为 ISet,但它仍然让我添加重复条目。我的实体有 3 个属性。 -Id -Audio -DateTime 如果我没有在该属性上使用 [DomainSignature] 过滤器,DateTime 属性是否会使每个下载都是唯一的,或者是否应该忽略这一点?保罗
-
我认为您需要覆盖 AudioDownload 类上的 equals
-
我相信 DomainSignature 过滤器已经为您执行此操作,它们是 s#arp 框架的一部分。我相信他们会覆盖等号和哈希码。在我调用我的域上的 AudioDownloads.Add() 方法之前,我只需要检查该项目是否存在于我的服务层内的数据库中。
标签: nhibernate contains