既存のデータベース (実際には 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; }
}
次のように、ジョブと成果物の間の「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 results = session .CreateCriteria(typeof(Job)) .Add(Expression.Eq("コード", "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);
}
}
それで、マッピングは間違っていますか、それとも私がそれらを使用している方法に問題がありますか?
事前に感謝します。私は一日中これを見つめていました。