首先,我使用的是 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 异常,并且所有字段都设置正确。
我的问题是,映射这三个类的最佳方法是什么?我还需要做其他事情吗?我是不是忘记了什么?