多个HasMany关系中表的流畅NHibernate映射

时间:2012-05-18 19:49:19

标签: nhibernate fluent-nhibernate nhibernate-mapping

我的班级映射有什么问题?

public class Foo
{
    public Foo()
    {
        ActualCurve = new List<Point>();
        TargetCurve = new List<Point>();
    }
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Point> ActualCurve { get; set; }
    public virtual IList<Point> TargetCurve { get; set; }
}

public class Point
{
    public virtual int Id { get; set; }
    public virtual double X { get; set; }
    public virtual double Y { get; set; }
}

public class FooMapping() : ClassMap<Foo>
{
    Table("Foos");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Name).Not.Nullable();
    HasMany(x => x.ActualCurve ).Cascade.All();
    HasMany(x => x.TargetCurve ).Cascade.All();
}

public class PointMapping() : ClassMap<Point>
{
    Table("Points");
    Not.LazyLoad();
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.X).Not.Nullable();
    Map(x => x.Y).Not.Nullable();
}

这些映射产生

CREATE TABLE [dbo].[Foos](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar] NOT NULL,
    [RecipeRevisionId] [int] NOT NULL

CREATE TABLE [dbo].[Points](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [X] [float] NOT NULL,
    [Y] [float] NOT NULL,
    [FooId] [int] NOT NULL

基本上,问题在于当我将持久化的Foo对象拉回数据库时,Foo.ActualCurve和Foo.TargetCurve列表都会填充两个列表的组合内容。很明显没有一列可以键入哪一组点属于Foo中的正确曲线,但我不知道如何更改映射以维护两组不同的点。

1 个答案:

答案 0 :(得分:0)

我认为你需要为引用指定一个单独的列:

HasMany(x => x.ActualCurve ).Cascade.All().KeyColumn("ActualCurveId");
HasMany(x => x.TargetCurve ).Cascade.All().KeyColumn("TargetCurveId");

编辑:列 - &gt; KeyColumn