2011-08-30 119 views
1

我很难用流利NHibernate映射数据库。我正在处理的数据库是brownfield,一些关系实施得不好。流利的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来查看哪些是合适的。

我希望有人能指出我在正确的方向,通过规划他们将如何做,或者如果他们看到我如何接近它的任何问题。

+0

您是否可以更改数据库以及您的域对象,还是该固定点? – docmanhattan

+0

数据库已修复。 –

回答

0

我工作不为我映射数据库中的任何文件和事实证明,这是我的困难出现在哪里。 ToolPurpose与ToolA的关系实际上是多对一的关系,因此每个工具都有多种用途,ToolPurpose与ToolInstruction的关系也是多对一的关系,因此每个用途可以有多个与之相关的指令。

这意味着一个简单的HasMany()< - > References()映射可用于将ToolA,ToolPurpose和ToolInstruction表链接在一起。 ToolPurpose表中的空值不会以这种方式影响映射。

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

1

u可以使用这对你的问题的一部分:

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(); 
+0

感谢Porc的回应,但事实证明我对数据库的理解是错误的,创建一个关联ToolA和ToolInstruction的类并没有特别涉及。 –