Fluent NHibernate自动映射:一对多实体,多对多后端?

Fluent NHibernate自动映射:一对多实体,多对多后端?,nhibernate,fluent-nhibernate,database-schema,hbm2ddl,Nhibernate,Fluent Nhibernate,Database Schema,Hbm2ddl,我的目标是使用NHibernate模式生成和Fluent NHibernate的automapper生成我的数据库。我在所谓的“单向多对多关系”方面遇到了麻烦 我的许多实体都有本地化的资源。单个类可能如下所示: public class Something { public virtual int Id {get; private set;} public virtual Resource Title {get;set;} public virtual Resource Descri

我的目标是使用NHibernate模式生成和Fluent NHibernate的automapper生成我的数据库。我在所谓的“单向多对多关系”方面遇到了麻烦

我的许多实体都有本地化的资源。单个类可能如下所示:

public class Something {
  public virtual int Id {get; private set;}
  public virtual Resource Title {get;set;}
  public virtual Resource Description {get;set;}
  public virtual IList<Resource> Bullets {get;set;}
}
如果没有
IList
,所有内容都会按照我的意愿生成——资源ID位于
标题
描述
字段中。但是,当我在
IList
中添加字段时,NHibernate将
something\u id
添加到
资源表中。我理解为什么会这样,但在这种情况下,这不是一种可持续的方法

我想要的是为项目符号创建一个连接表。比如:

CREATE TABLE SomethingBullet (
  Id int NOT NULL PRIMARY KEY IDENTITY(1,1),
  Something_Id int NOT NULL,
  Resource_Id int NOT NULL
)
这样,当我将另外20多个实体添加到数据库中时,我就不会得到一个宽得离谱、稀疏得离谱的
Resource


我如何指示Automapper以这种方式处理所有
IList
属性?

事实上,每个多对多都由对象模型中的一对多组成。如果你的关系不需要是双向的,就不要映射到第二面。映射侧的映射完全不受影响:

HasManyToMany(x => x.Bullets).AsSet();
在这种情况下,NHibernate已经知道它需要生成中间表

有关提示,请参见本文。

:)

我发现使用自动映射的唯一方法是构建自己的自定义自动映射步骤并替换“本机”HasManyToManyStep。恐怕不是那个就是超控

我把我的拿开了

好消息是,到目前为止,Samer的代码似乎与我的约定和诸如此类的东西完美地结合在一起,因此,一旦它到位,它对我代码中的所有其他内容都是完全透明的

坏消息是,由于Samer的代码假设所有x-to-many单向关系都是多对多的关系,因此它会使您失去拥有单向一对多关系的能力。根据您的型号,这可能是一件好事,也可能不是一件好事

大概,您可以编写一个不同的ShouldMap实现,将您想要的多对多和您想要的一对多区分开来,然后一切都会再次工作。请注意,这需要有两个自定义步骤来替换本机HasManyToManyStep,尽管Samer的代码也是一个很好的起点

让我们知道进展情况。:)

干杯,

J.

+1-查看链接博客,了解如何使用FNH和新的NH代码映射进行映射的优秀指导。
HasManyToMany(x => x.Bullets).AsSet();