我有两个主要实体(数据库表)
我有一个名为 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 语法,所以我不确定它是否会对生成的查询或性能等产生影响
请告知
答案 0 :(得分:1)
一般来说,有两种方法,正如您所正确提到的那样:
one-to-many
和many-to-one
many-to-many
我(我的个人陈述)几乎在任何情况下都会避免many-to-many
(在某些非常罕见的情况下,可以使用真正的管理对象方案)。
以下是我的一些尝试,以解释:
要在此处添加更多内容,我首先要提到的是,对于many-to-many
,我们正在丢失模型中的配对对象。永远。所以,一旦我们的客户来问问:请,我的关系之一主要,或者介绍排序 - 我们根本不能。这种关系就是这样。无法如何扩展它。
其次,很有可能 - 很可能:我们的客户会来问:您能否为我创建一个过滤器,只选择与{{1}相关的Projects
将某些设置设置为 true AND ...
在Application
案例中,这会有点挑战。
具有显式配对对象的场景为第三个实体带来了更多开销。但可以转换为子查询
有一些many-to-many
权力的例子:
嗯,这是我的观点。不是说它是正确的。但是我的经验表明,通过显式配对对象映射,我们已经为扩展和复杂查询做好了准备。