DB2 Fluent NHibernate映射HasMany映射中的重复记录
我正在访问一个预先存在的数据库(实际上是IBMi上的DB2),并且在FluentNHibernate中对以下(简单)结构的映射有问题。我不得不构建一个人工的例子,所以请原谅我的任何误解 工作DB2 Fluent NHibernate映射HasMany映射中的重复记录,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,db2-400,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,Db2 400,我正在访问一个预先存在的数据库(实际上是IBMi上的DB2),并且在FluentNHibernate中对以下(简单)结构的映射有问题。我不得不构建一个人工的例子,所以请原谅我的任何误解 工作 public class Job { public virtual string JobCode { get; set; } public virtual string Owner{ get; set; } public virtual IList<Deliverable&
public class Job
{
public virtual string JobCode { get; set; }
public virtual string Owner{ get; set; }
public virtual IList<Deliverable> Deliverables { get; set; }
public Job()
{
Deliverables = new List<Deliverable>();
}
}
我试图在工作和可交付成果之间建立一种“HasMany”关系,如下所示
public class JobMap : ClassMap<Job>
{
public JobMap()
{
Table("JOB");
Id(x => x.JobCode).Column("CODE");
Map(x => x.Owner).Column("WHODO");
HasMany(x => x.Deliverables)
.KeyColumn("CODE");
}
}
public class DeliverableMap : ClassMap<Deliverable>
{
public DeliverableMap()
{
Table("DELIVERABLE");
Id(x => x.JobCode).Column("CODE");
Map(x => x.Reference).Column("UNQREF");
Map(x => x.Owner).Column("WHODO");
References( x => x.Job)
.Column("CODE") ;
}
}
那么,映射是否不正确,或者我使用它们的方式是否有问题
非常感谢,我整天都在关注这一点。在多对一关系中(在我们的案例中,deliverable
和Job
),关系本身用精确的oneDB列表示。子表(可交付成果
)具有(必须具有)一个带有作业ID(代码)的引用列
因此,我们需要映射的是Deliverable表中的列,其中包含与作业的关系。JobCode
列。(根据上面的示例,不确定是否有)
这必须在两侧使用:
可交付:
public DeliverableMap()
{
...
// References( x => x.Deliverable) ... I guess it is typo in the question snippet
References( x => x.Job)
.Column("JobCode") ; // column of table Deliverable
}
工作:
换句话说,此映射中的两个列名实际上都是one列的名称。两者都映射到子(可交付)表的列
扩展:基于问题中的映射更改
可交付成果
对象的ID
(列代码)与对作业
(列代码)的引用相同。这似乎很奇怪
这也解释了一个事实,即作业集合中的所有可交付项都是相同的。唯一可交付成果(由其代码定义)只能是一个。此场景中的作业不能有多个可交付成果(因为它由唯一代码列引用)。这似乎是一对一的情景
为什么有更多的项目相同的更难判断。看到您正在使用的查询会很好
但我确实要检查两次列映射。可交付成果,应在名为“作业代码”的列中引用作业。。。支持更多要关联的可交付项…我似乎已经修复了它。我将CompositeID添加到可交付成果映射中
CompositeId()
.KeyProperty(x => x.JobCode, "CODE")
.KeyProperty(x => x.Reference, "UNQREF");
这意味着我必须在可交付类中重写以下内容
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as Deliverable;
if (t == null)
return false;
if (JobCode == t.JobCode && Reference == t.Reference)
return true;
return false;
}
public override int GetHashCode()
{
return (JobCode + "|" + Reference).GetHashCode();
}
然后还更改了作业映射,如下所示
HasMany(x => x.Deliverables)
.KeyColumn("Codex")
.Inverse()
.Cascade.All();
我不确定哪一个已经纠正了这种情况(我怀疑作业映射中的.Inverse()
)
我不确定生成的SQL现在看起来是什么样子,但答案看起来是正确的。谢谢-我已经更正了原始问题中的错误。我的代码基本上与您上面建议的一样。当复制并在本地运行生成的SQL时,会生成所需的结果,但是由我的代码生成的可交付成果集合具有正确的nu结果的数量,但有相同的结果。我扩展了我的答案。我觉得真正奇怪的是“代码”列作为ID和作业引用…实际文件对于用于连接它们的字段具有相同的字段名-可交付文件有一个由此和唯一引用组成的“复合”键-即作业(1)->可交付文件(1)(1),作业(1)->可交付成果(1)(2),作业(1)->可交付成果(1)(3),作业(1)->可交付成果(2)(1)等(抱歉格式化)抱歉,如果我没有得到它。但是您的映射显示:代码的ID和代码的引用ID。这对我来说似乎是个问题。但可能我没有正确理解。如果您映射(如代码片段中所示)使用代码和代码是ID(唯一的),那么对我来说这似乎是个问题。建议:提供真正的映射。只有这样我们才能找到问题;)每个基础表都有一个名为“代码”的字段,对此我无能为力。这似乎是问题的原因。即使我更改了类中字段的名称,底层字段名称似乎也会产生干扰。正如我最初发布的,生成的SQL实际上是“工作”的,它似乎只是一个令人困惑的流畅的NHibernate。是的,它是有意义的。正如我所说,映射为ID和referenceId的代码是不够的。丢失的真正唯一ID导致了该问题。很好,你让它为你工作。享受NHiberante;)谢谢你的帮助。这一切都开始让人感觉恶心;)非常好;)
CompositeId()
.KeyProperty(x => x.JobCode, "CODE")
.KeyProperty(x => x.Reference, "UNQREF");
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as Deliverable;
if (t == null)
return false;
if (JobCode == t.JobCode && Reference == t.Reference)
return true;
return false;
}
public override int GetHashCode()
{
return (JobCode + "|" + Reference).GetHashCode();
}
HasMany(x => x.Deliverables)
.KeyColumn("Codex")
.Inverse()
.Cascade.All();