0

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

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 个 id 字段,o 这第三个表只有 2 个字段是主键的一部分。我还尝试为 3 个关系分配表名,NHibernate 只生成一个包含 3 个字段的表,但同样,其中只有 2 个是 Primery Key 的一部分。我假设 3 字段必须是给定这种类型的映射的主键的一部分。

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

我的问题是,映射这三个类的最佳方法是什么?我还需要做其他事情吗?我是不是忘记了什么?

4

1 回答 1

1

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

HasManyToMany(a => a.ClassesB)
     .AsSet()
     .WithTableName("TBL_A_TO_B")
     .WithParentKeyColumn("A_ID")
     .WithChildKeyColumn("B_ID")
     .Cascade.All();
于 2012-07-17T10:15:40.453 回答