3

我的目标是使用 NHibernate 模式生成以及 Fluent NHibernate 的自动映射器来生成我的数据库。我遇到了我称之为“单向多对多关系”的问题。

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

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;}
}

该类Resource没有任何引用;这些完全是单向的。

public class Resource {
    public virtual int Id {get; private set;}
    public virtual IList<LocalizedResource> LocalizedResources {get;set;}
    // etc.
}
public class LocalizedResource { // 
    public virtual int Id {get; private set; }
    public virtual string CultureCode {get;set;}
    public virtual string Value {get;set;}
    public virtual Resource Resource {get;set;}
}

如果没有IList<Resource>,一切都会按照我的意愿生成——资源 ID 位于TitleandDescription字段中。当我添加时IList,NHibernate 将该字段添加something_idResource表中。我理解它为什么这样做,但在这种情况下,它不是一种可持续的方法。

我想要的是为子弹创建一个连接表。就像是:

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<Resource>这种方式处理所有属性?

4

2 回答 2

4

实际上,每个多对多都是由一对多的对象模型组成的。如果您的关系不需要是双向的,则不要映射第二面。映射端的映射完全不受影响:

HasManyToMany(x => x.Bullets).AsSet();

在这种情况下,NHibernate 已经知道它需要生成中间表。

另请参阅本文以获取多对多提示。

于 2012-02-11T10:51:14.450 回答
0

:)

我发现使用自动映射进行这项工作的唯一方法是构建您自己的自定义自动映射步骤并替换“本机”HasManyToManyStep。恐怕是那个或覆盖。

我从Samer Abu Rabie 身上取下了我的,张贴在这里

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

坏消息是,它会让你失去建立单向一对多关系的能力,因为 Samer 的代码假设所有x 对多单向关系都是多对多的。根据您的型号,这可能是也可能不是一件好事。

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

让我们知道怎么回事。:)

干杯,
J。

于 2012-09-04T01:49:03.460 回答