1

Wenn ich eine Entität speichern, die eine Eins-zu-viele-Beziehung (HasMany) hat, werden die Register in der Datenbank dupliziert.Fließende nhibernate doppelte Register mit Eins-zu-viele-Zuordnung

Bild von PedidoVenda Tabelle:

enter image description here

Bild von ItemPedidoVenda Tabelle:

enter image description here

Ich kann in diesem sehen Bilder, die das Problem ist, weil die ID von ItemPedidoVenda ein vorwärts ist das PedidoVenda id. Aber das wird automatisch gespeichert. Was kann das sein?

Meine Eigenschaften in den Klassen sind diese:

public class PedidoVenda { 

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

public class ItemPedidoVenda { 

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

Die Mapper:

PedidoVendaMapper:

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

ItemPedidoVendaMapper:

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

Antwort

0

Beim Hinzufügen eines iTEMP edidoVenda Instanz zu der Liste der Elemente in PedidoVenda, müssen Sie sicherstellen, dass Sie die Pedido-Eigenschaft in ItemPedidoVenda auf die richtige Instanz festlegen.

Ich bin mir ziemlich sicher, dass du das nicht machst.

Was ich meistens tue, ist zu verhindern, dass der Benutzer meiner API (der Programmierer :)) kann nicht direkt zu der Liste Elemente hinzufügen. Stattdessen schreibe ich eine Addxxx-Methode, die Elemente zur Liste hinzufügt.

Daneben müssen Sie sicherstellen, dass Sie den richtigen Sammlertyp verwenden. ich würde einen Satz in Ihrem Fall

Wie dies vorschlagen:

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

}

Verwandte Themen