gpt4 book ai didi

nhibernate - DB2 Fluent NHibernate 在 HasMany 映射中映射重复记录

转载 作者:行者123 更新时间:2023-12-04 04:43:53 24 4
gpt4 key购买 nike

我访问了一个预先存在的数据库(实际上是 IBM i 上的 DB2),并且在 Fluent NHibernate 中遇到了以下(简单)结构的映射问题。我不得不构建一个人为的例子,所以请原谅任何遗漏。

工作...

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

可交付..
public class Deliverable
{
public virtual string JobCode { get; set; }

public virtual int Package { get; set; }

public virtual string Owner { get; set; }

public virtual string Reference { get; set; }

public virtual Job Job { get; set; }
}

我正在尝试映射 Job 和 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") ;
}
}

这似乎有效,如果您使用生成的 SQL,并直接运行它,则会返回正确的结果(在本例中为 11 条记录,所有记录都是唯一的)。但是,当我执行以下操作时,可交付成果列表有 11 个完全相同的条目。

IList 结果 = session
.CreateCriteria(typeof(Job))
.Add(Expression.Eq("Code", "206171"))
.List();
foreach (var job in results)
{
Console.WriteLine("job.JobCode" + job.JobCode);
Console.WriteLine("job.Owner" + job.Owner);

foreach (var deliverable in job.Deliverables)
{

**// These are all identical!**

Console.WriteLine(deliverable.Reference);
Console.WriteLine("deliverable.Owner" + deliverable.Owner);
Console.WriteLine(deliverable.JobNumber);
Console.WriteLine(deliverable.DeliverableTyoe);
Console.WriteLine(deliverable.Description);
}
}

那么,映射不正确,还是我使用它们的方式有问题?

非常感谢,我一整天都在盯着这个。

最佳答案

我好像修好了。我将 CompositeID 添加到 Deliverables 映射

 CompositeId()
.KeyProperty(x => x.JobCode, "CODE")
.KeyProperty(x => x.Reference, "UNQREF");

这意味着我必须在 Deliverable 类中覆盖以下内容
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 现在是什么样子,但答案看起来是正确的。

关于nhibernate - DB2 Fluent NHibernate 在 HasMany 映射中映射重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18497647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com