我在使用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之间交替看看哪个是合适的。
我希望有人可以通过说明他们将如何做到这一点,或者如果他们看到我接近它的方式有任何问题,可以指出我正确的方向。
答案 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。