流畅的nhibernate重复寄存器,具有一对多映射

时间:2016-11-18 10:48:37

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

当我保存具有一对多(HasMany)关系的实体时,在数据库上会重复寄存器。

PedidoVenda表的图片:

enter image description here

ItemPedidoVenda表的图片:

enter image description here

我可以在这张照片中看到问题是因为ItemPedidoVenda的id是PedidoVenda id的一个前锋。但这会自动保存。这可能是什么?

我在课堂上的属性是:

public class PedidoVenda {

    public virtual IList<ItemPedidoVenda> Itens { get; set; }
    ...
}

public class ItemPedidoVenda {

    public virtual PedidoVenda Pedido { get; set; }
    ...
}

地图制作者:

PedidoVendaMapper:

    HasMany(x => x.Itens)
        .KeyColumn("PEDIDO_ID")
        .Inverse()
        .Cascade.All();

ItemPedidoVendaMapper:

References(x => x.Pedido)
            .Column("PEDIDO_ID").Cascade.All();

1 个答案:

答案 0 :(得分:0)

将ItemPedidoVenda实例添加到PedidoVenda中的项目列表时,必须确保将ItemPedidoVenda中的Pedido属性设置为正确的实例。

我很确定你没有这样做。

我最常做的是阻止我的API用户(程序员:))无法直接向列表中添加项目。相反,我编写了一个Addxxx方法,它将项添加到列表中。

接下来,您必须确保使用正确的集合类型。我会在你的案例中建议一套

像这样:

public class PedidoVenda {

    private ISet<ItemPedidoVenda> _itens = new HashedSet<ItemPedidoVenda>();

    // The public property which returns the collection is a REadOnlyCollection so the user cannot mess around with it.
    public ReadOnlyCollection<ItemPedidoVenda> Itens 
    { 
        get 
        {
           return new List<ItemPedidoVenda>(_itens).AsReadOnly();
        } 
    }

    public void AddPedido( ItemPedidoVenda item )
    {
       if( _itens.Contains(item) == false )
       {
           item.Pedido = this; // Here, make sure that the reference is filled out.
           _itens.Add(item);
       }
    }

}