2012-02-11 82 views
3

我的目标是使用NHibernate架构生成和Fluent NHibernate的automapper来生成我的数据库。我遇到了我称之为“单向多对多关系”的问题。流利的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是在TitleDescription领域。但是,当我添加IList时,NHibernate将字段something_id添加到Resource表中。我明白为什么会这样做,但在这种情况下,这不是一种可持续的方法。

我想要的是为子弹创建联结表。喜欢的东西:

CREATE TABLE SomethingBullet (
    Id int NOT NULL PRIMARY KEY IDENTITY(1,1), 
    Something_Id int NOT NULL, 
    Resource_Id int NOT NULL 
) 

这样,当我添加了其他26多实体为我不会跟一个可笑的宽而疏Resource表来结束该数据库。

如何指示Automapper以这种方式对待所有IList<Resource>属性?

回答

4

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

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

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

请参阅这篇文章的many-to-many提示。

+0

+1 - 检查链接的博客以了解如何做映射既FNH和代码的新NH映射了很好的指导。 – 2012-02-13 17:24:24

0

:)

我发现,以与自动映射这项工作是通过构建自己的自定义自动映射步骤,并且取代“本土” HasManyToManyStep的唯一途径。恐怕这不是或者是超越。

我从Samer Abu Rabie, posted here中解雇了我的矿工。

好消息是,到目前为止,Samer的代码似乎完美地与我的约定和whatnots一起工作,所以,一旦到位,它对我的​​代码中的其他任何内容都是完全透明的。

坏消息是,它的成本你有单向一个一对多的关系的能力,作为萨默尔的代码假定所有 X一对多的单向关系,很多一对多。根据你的模型,这可能会或可能不会是一件好事。

大概你可以编写一个不同的ShouldMap实现来区分你想要的是多对多还是你想要成为一对多,然后所有东西都可以再次工作。请注意,这将需要有两个自定义步骤来取代本机HasManyToManyStep,虽然再次,Samer的代码是一个很好的起点。

让我们知道它是如何发展的。 :)

干杯,
J.

相关问题