DB2 Fluent NHibernate映射HasMany映射中的重复记录

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&

我正在访问一个预先存在的数据库(实际上是IBMi上的DB2),并且在FluentNHibernate中对以下(简单)结构的映射有问题。我不得不构建一个人工的例子,所以请原谅我的任何误解

工作

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