流利的NHibernate多对多映射3类 [英] Fluent NHibernate Many-To-Many Mapping with 3 classes

查看:156
本文介绍了流利的NHibernate多对多映射3类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

pre $公共类classA
{
公共虚拟Int32 Id {获取; }
....
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 (m => m.ClassesB).Cascade.SaveUpdate()。AsSet()。ReadOnlyAccess();
HasManyToMany (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 (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 (m => m.ClassesB).Cascade.SaveUpdate()。AsSet()。ReadOnlyAccess();






$ b每个类都有一个集合给另外两个类,不要问为什么,但我需要将其映射到数据库。 Nhibernate生成3个表,其中2个有两个字段,第三个有所有类的3个id字段。第三个表中只有2个字段是主键的一部分。我也尝试为3个关系指定表名,NHibernate只生成一个包含3个字段的表,但是同样只有2个表是Primery Key的一部分。我假设3字段必须是给定这种类型映射的主键的一部分。



问题是我不能将项目添加到集合我也尝试添加项目到另一个类,例如:当我添加ClassB到ClassA也添加ClassA到ClassB维护关系),当我试图保存到数据库时,它会引发一个FOREING KEY异常和所有的字段设置正确。

我的问题是,映射这三个类的最佳方法是什么?我需要做其他事情吗?我是否伪造了一些东西?

解决方案

我相信你需要给NH一些关于关系的更多细节。
试试在A的映射和B的映射中写出完整的定义:

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


First, I'm using NHibernate 3.2 and FluentNHibernate 1.3. I have 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; }
}

I mapped them with this code:

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();
    }
}

Each class has a collection to the other 2 classes, don't ask why, but I need to map this to a database. Nhibernate generates 3 tables, 2 of them with 2 fields and the third one with the 3 id fields from all the classes, o this third table just 2 fields are part of a Primary Key. I also tryed to asign the table name for the 3 relationships, and NHibernate generates just one table with the 3 fields, but again, only 2 of them are part of the Primery Key. I'm assuming that the 3 field must be part of the primary key given this type of mapping.

The problem is that I can't add items to either collection (I also tried adding the item to the other side class, eg: when I add ClassB to ClassA also add ClassA to ClassB to maintaing the relationship), when I tried to save to database, It throws a FOREING KEY exception and all of the field are set correctly.

My question is, what is the best way to map these three classes? Do I need to do anything else? Am I forgeting something?

解决方案

I believe you need to give NH some more details about the relations.
Try Writing the full definition in A's mapping and B's mapping:

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

这篇关于流利的NHibernate多对多映射3类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆