使用流利的nhibernate时,我做错了很多次吗?

我有两个主要实体(数据库表)

  1. 项目
  2. 应用

我有一个名为ProjectApplication的桥表,带有3列(Id,ProjectId,ApplicationId)

一个项目可以有很多应用程序。 应用程序可以在很多不同的项目下面

您的基本多对多映射

目前这是我在流利的nhibernate映射文件中设置的

public class ProjectMap { HasMany(x => x.ProjectApplications) .AsBag().Inverse().Cascade.AllDeleteOrphan().Fetch.Select().BatchSize(80); } public class ApplicationMap { HasMany(x => x.ProjectsApplications) .AsBag().Inverse().Fetch.Select().BatchSize(50); } 

这是否有任何缺点,因为我看到有一个HasManyToMany语法所以我不确定它是否在生成的查询或性能等方面有所作为

请指教

一般来说,有两种方法,正如您正确提到的:

  • 配对对象的显式映射,导致one-to-manymany-to-one
  • 隐式映射,不知道使用many-to-many的基础表

(我的个人陈述)几乎可以在任何场景中避免many-to-many (虽然在一些非常罕见的情况下,可以使用真正的管理对象场景)

以下是我的一些尝试,以解释:

  • 如何创建NHibernate HasManyToMany关系
  • 带有额外列的多对多nhibernate
  • Nhibernate:如何用一对多关系表示多对多关系?

为了在这里添加更多内容,我首先要提到的是,对于many-to-many我们正在从模型中丢失配对对象。 永远。 所以,一旦我们的客户来问问:请,让我的关系之一主要 ,或介绍排序 – 我们根本不能。 这种关系就是这样。 无法如何扩展它。

其次,很有可能 – 非常可能 :我们的客户会来问:你能为我创建一个filter,只选择与Application相关的Projects ,将一些设置设置为true AND …

many-to-many情况下,这将是一个挑战。

具有显式配对对象的场景为第三个实体带来了更多开销。 但可以转换为子查询

有一些Subqueryfunction的例子:

  • 查询HasMany引用
  • 是否可以使用NHibernate查询具有一个或多个可能子项的所有对象?

嗯,这是我的观点。 不是说它是正确的。 但是我的经验表明,通过显式对对象映射,我们已经为扩展和复杂查询做好了准备。