【问题标题】:NHibernate Domain Model - Adding Child Objects to CollectionsNHibernate 域模型 - 将子对象添加到集合
【发布时间】: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


【解决方案1】:

我希望执行此操作的大多数方法总是会导致您从数据库中查询所有下载,这可能不是您想要的。

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

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

另一方面:从同一个 IP 多次下载某些东西会不会很有趣?

【讨论】:

  • 我想这样做的原因是为了保持每个音频有多少独特的下载。这种情况是否有替代方法。我还有一个名为 AudioDownloadsByUser 的单独实体,它不是记录 IP,而是在登录时记录用户 ID。它们都继承自 AudioHit。 AudioHit - AudioDownloadByIp - AudioDownloadByUser 我将调查 ISet 和您的方法,将回复我的发现。多谢你们!保罗
  • 如果您想要每个 IP 的唯一下载量,您还可以编写一个“不同”查询来计算该数字。附带说明:不能真正保证同一个人始终使用 IP。一些互联网提供商不会在不同的时间点为他们的用户提供相同的 IP,因此结果的价值可能不会那么高(您使用登录用户的方法更可靠)...
  • 我意识到这一点并且我知道它不会是 100%,不幸的是我还需要对未登录的成员进行计数。我混合使用会话、Cookie 和 IP 地址来尝试尽可能缩小范围。不过感谢您的提醒!
猜你喜欢
  • 2013-10-11
  • 2014-12-09
  • 2014-12-02
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-29
相关资源
最近更新 更多