通过代码休眠多对多映射

时间:2018-08-07 06:20:26

标签: postgresql nhibernate

我有一个实体类:

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对象有两个列表,我需要在数据库中以多对多关系表示这些对象。

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

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

);

现在,我的问题是如何通过代码为这种情况定义多对多映射,以及对关联表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中,反之亦然-它们已交换位置。

我在这里想念东西吗?

1 个答案:

答案 0 :(得分:0)

这是应该怎么做:

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