首页 > 解决方案 > 通过代码休眠多对多映射

问题描述

我有一个实体类:

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反之亦然 - 它们交换了位置。

我在这里错过了什么吗?

标签: postgresqlnhibernate

解决方案


这是应该如何完成的:

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

推荐阅读