通过代码休眠多对多映射

nhibernate many to many mapping via code

我有一个实体class:

public class Item
{
    public int Id {get; set;}
    public string Name {get; set;}

    public virtual IList<Item> OriginItems {get; set;}
    public virtual IList<Item> ResultItems {get; set;}
}

如您所见,有两个 Item 对象列表,我需要在我的数据库中以多对多关系表示它们。

这是我创建关联 table 的脚本:

CREATE TABLE public.item_transformation
(
   origin_item_id integer NOT NULL,
   result_item_id integer NOT NULL,
   CONSTRAINT result_fkey FOREIGN KEY (result_item_id)
       REFERENCES public.item (id) MATCH SIMPLE
       ON UPDATE NO ACTION ON DELETE NO ACTION,
   CONSTRAINT origin__fkey FOREIGN KEY (origin_item_id)
       REFERENCES public.item (id) MATCH SIMPLE
       ON UPDATE NO ACTION ON DELETE NO ACTION

);

现在,我的问题是如何通过代码为这种情况定义多对多映射以及关联约束如何 table ItemTransformation - 如何正确设置它们?

更新: 现在我有这样的映射代码:

        Bag(u => u.OriginItems, map =>
        {
            map.Table("item_transformation");
            map.Key(k => k.Column("origin_item_id"));
        }, ce => ce.ManyToMany(m =>
        {
            m.Column("result_item_id");
        }));

        Bag(u => u.ResultItems, map =>
        {
            map.Table("item_transformation");
            map.Key(k => k.Column("result_item_id"));
        }, ce => ce.ManyToMany(m =>
        {
            m.Column("origin_item_id");
        }));

但似乎 origin_item_id 的值保存在 result_item_id 中,反之亦然 - 它们交换了位置。

我是不是漏掉了什么?

操作方法如下:

    Bag(u => u.OriginItems, map =>
    {
        map.Table("item_transformation");
        map.Key(k => k.Column("result_item_id")); // swapped
    }, ce => ce.ManyToMany(m =>
    {
        m.Column("origin_item_id"); // swapped
    }));

    Bag(u => u.ResultItems, map =>
    {
        map.Table("item_transformation");
        map.Key(k => k.Column("origin_item_id")); // spapped
    }, ce => ce.ManyToMany(m =>
    {
        m.Column("result_item_id"); // swapped
    }));