流畅的NHibernate多对多映射与3个类

时间:2012-07-17 08:52:37

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping .net

首先,我使用的是NHibernate 3.2和FluentNHibernate 1.3。我有3个clasess:

public class ClassA
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassB> ClassesB { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassB
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassC> ClassesC { get; }
}

public class ClassC
{
    public virtual Int32 Id{ get; }
    ....
    public ICollection<ClassA> ClassesA { get; }
    public ICollection<ClassB> ClassesB { get; }
}

我用这段代码映射它们:

public class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
        : base()
    {
        Id(m => m.Id);
        ....

        HasManyToMany<ClassB>(m => m.ClassesB).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
        HasManyToMany<ClassC>(m => m.ClassesC).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
    }
}

public class ClassBMap : ClassMap<ClassB>
{
    public ClassBMap()
        : base()
    {
        Id(m => m.Id);
        ....

        HasManyToMany<ClassA>(m => m.ClassesA).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
        HasManyToMany<ClassC>(m => m.ClassesC).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
    }
}

public class ClassCMap : ClassMap<ClassC>
{
    public ClassCMap()
        : base()
    {
        Id(m => m.Id);
        ....

        HasManyToMany<ClassA>(m => m.ClassesA).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
        HasManyToMany<ClassB>(m => m.ClassesB).Cascade.SaveUpdate().AsSet().ReadOnlyAccess();
    }
}

每个类都有一个集合到其他2个类,不要问为什么,但我需要将它映射到数据库。 Nhibernate生成3个表,其中2个包含2个字段,第3个表包含来自所有类的3个id字段,o第三个表只有2个字段是主键的一部分。我还尝试为3个关系设置表名,NHibernate只生成一个包含3个字段的表,但同样只有2个是Primery Key的一部分。我假设在给定这种映射的情况下,3字段必须是主键的一部分。

问题是我无法向任何一个集合中添加项目(我也尝试将项目添加到另一个类,例如:当我将ClassB添加到ClassA时也将ClassA添加到ClassB以维护关系),当我试图保存到数据库,它抛出一个FOREING KEY异常并且所有字段都设置正确。

我的问题是,映射这三个类的最佳方法是什么?我还需要做其他事吗?我在伪造什么吗?

1 个答案:

答案 0 :(得分:1)

我相信你需要向NH提供有关这些关系的更多细节。
尝试在A的映射和B的映射中编写完整的定义:

HasManyToMany(a => a.ClassesB)
     .AsSet()
     .WithTableName("TBL_A_TO_B")
     .WithParentKeyColumn("A_ID")
     .WithChildKeyColumn("B_ID")
     .Cascade.All();