Fluent-NHibernate映射问题

Fluent-NHibernate映射问题,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我在使用Fluent NHibernate映射数据库时遇到困难。我正在处理的数据库是brownfield,其中一些关系的实现很差 下表描述了我尝试执行的映射: +----------+ +----------+ +---------------+ +-------------------+ | ToolA | | ToolB | | ToolPurpose | | ToolInstruction | +==========+ +==========+ +=========

我在使用Fluent NHibernate映射数据库时遇到困难。我正在处理的数据库是brownfield,其中一些关系的实现很差

下表描述了我尝试执行的映射:

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

我认为给我带来困难的是,ToolPurpose表中的每个ToolA和ToolB条目都有一行,因此对于ToolA条目,ToolB_Id为null,反之亦然

例如:

+--------------------------------------------------+
|Purpose_Id | ToolA_Id | ToolB_Id | Purpose        |
|===================================================
|1          | 1        | null     | "purpose here" |
|2          | null     | 1        | "purpose here" |
+--------------------------------------------------+
我尝试过几种方法,当使用PersistenceSpecification.VerifyTheMappings()方法时,它们已经显示出工作的迹象,但当我尝试从备份数据库中提取数据时,它们就不起作用了,因为我开始遇到空引用异常

我尝试将ToolPurpose映射为链接器类,并尝试使用ToolA映射类中的Join方法来映射它。我还交替使用HasOne和HasMany,看看哪一个更合适


我希望有人能给我指出正确的方向,告诉我他们将如何做,或者他们是否看到我在处理这件事方面存在任何问题。

你们可以用这个来回答你们的部分问题:

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();
ToolA
------
ToolBs=新字典();
公共虚拟IDictionary ToolBs{get;set;}
HasmanyToalMany(x=>x.ToolBs)
.表格(“工具用途”)
.ChildKeyColumn(“工具B_Id”)
.ParentKeyColumn(“工具A_Id”)
.AsMap(“目的”)
.Cascade.All();

您可以将此用于部分问题:

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();
ToolA
------
ToolBs=新字典();
公共虚拟IDictionary ToolBs{get;set;}
HasmanyToalMany(x=>x.ToolBs)
.表格(“工具用途”)
.ChildKeyColumn(“工具B_Id”)
.ParentKeyColumn(“工具A_Id”)
.AsMap(“目的”)
.Cascade.All();

我在没有任何文档的情况下为所映射的数据库工作,结果发现这就是我遇到困难的地方。ToolPurpose-to-ToolA关系实际上是一种多对一关系,这样每个工具都有多个用途,ToolPurpose-to-ToolInstruction关系也是一种多对一关系,这样每个用途都可以有多个与其相关的指令

这意味着可以使用直接的hassmany()References()映射将ToolA、ToolPurpose和ToolInstruction表链接在一起。ToolPurpose表中的null值不会以这种方式影响映射


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

我在没有任何文档的情况下为我映射的数据库工作,结果发现这就是我遇到困难的地方。ToolPurpose-to-ToolA关系实际上是一种多对一关系,这样每个工具都有多个用途,ToolPurpose-to-ToolInstruction关系也是一种多对一关系,这样每个用途都可以有多个与其相关的指令

这意味着可以使用直接的hassmany()References()映射将ToolA、ToolPurpose和ToolInstruction表链接在一起。ToolPurpose表中的null值不会以这种方式影响映射


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

您是否能够更改数据库以及域对象,或者这是一个固定点?您是否能够更改数据库以及域对象,或者这是一个固定点吗?感谢响应过程,但事实证明我对数据库的理解是错误的,创建一个类来关联ToolA和ToolInstruction并没有特别涉及。感谢响应过程,但事实证明我对数据库的理解是错误的,创建了一个类来关联ToolA和ToolInstruction工具说明并没有特别涉及。