流畅的NHibernate映射问题

时间:2011-08-30 13:17:55

标签: nhibernate fluent-nhibernate nhibernate-mapping

我在使用Fluent NHibernate映射数据库时遇到了困难。我正在研究的数据库是棕色地带,而且一些关系实施得很差。

我试图做的映射由下表描述:

+----------+ +----------+ +---------------+  +-------------------+
| ToolA    | | ToolB    | | ToolPurpose   |  | ToolInstruction   |
+==========+ +==========+ +===============+  +===================+
| ToolA_Id | | ToolB_Id | | Purpose_Id    |  | ToolInstruction_Id|
| Name     | | Name     | | ToolA_Id      |  | Purpose_Id        |
+----------+ +----------+ | ToolB_Id      |  | Instruction       |
                          | Purpose       |  +-------------------+
                          +---------------+

我要做的是将表ToolA与表ToolInstruction映射到一个类,如:

public class ToolA
{
    public virtual int _ToolA_id { get; set; }
    public virtual string _Name { get; set; }
    public virtual string _Instruction { get; set; }
}

OR

public class ToolA
{
    public virtual int _ToolA_id { get; set; }
    public virtual string _Name { get; set; }
    public virtual ToolInstruction _ToolInstruction{ get; set; }
}

public class ToolInstruction
{
    public virtual string _Instruction { get; set; }
}

我认为让我感到困难的是ToolPurpose表为每个ToolA和ToolB条目都有一行,这样对于ToolA条目,ToolB_Id为空,反之亦然。

例如:

+--------------------------------------------------+
|Purpose_Id | ToolA_Id | ToolB_Id | Purpose        |
|===================================================
|1          | 1        | null     | "purpose here" |
|2          | null     | 1        | "purpose here" |
+--------------------------------------------------+

我尝试了一些方法,并且在使用PersistenceSpecification.VerifyTheMappings()方法时已经显示出工作的迹象,但是当我尝试从备份数据库中提取数据时却没有,因为我开始遇到空引用异常。

我已经尝试将ToolPurpose映射为链接器类,并且我尝试使用ToolA映射类中的Join方法映射它。我还在使用HasOne和HasMany之间交替看看哪个是合适的。

我希望有人可以通过说明他们将如何做到这一点,或者如果他们看到我接近它的方式有任何问题,可以指出我正确的方向。

2 个答案:

答案 0 :(得分:1)

你可以将此问题用于你的部分问题:

ToolA
------
ToolBs = new Dictionary<string, ToolB>();
public virtual IDictionary<string, ToolB> ToolBs { get; set; }

HasManyToMany<ToolB>(x => x.ToolBs)
                .Table("ToolPurpose")
                .ChildKeyColumn("ToolB_Id ")
                .ParentKeyColumn("ToolA_Id")
                .AsMap<string>("Purpose")
                .Cascade.All();

答案 1 :(得分:0)

我正在没有任何关于我正在映射的数据库的文档,但事实证明这是我的困难所在。 ToolPurpose to ToolA关系实际上是多对一关系,因此每个工具都有多个目的,ToolPurpose与ToolInstruction关系也是多对一关系,因此每个目的可以有多个与之相关的指令。

这意味着直接的HasMany()&lt; - &gt; References()映射可用于将ToolA,ToolPurpose和ToolInstruction表链接在一起。 ToolPurpose表中的空值不会以这种方式影响映射。

我应该在我的公开帖中提到,我只是提取而不是更新或保存到数据库,所以我不需要完整的表映射,所以我不必映射ToolB。