1

Lorsque je sauvegarde une entité qui a une relation un-à-plusieurs (HasMany), les registres sont dupliqués dans la base de données.Registres dupliqués nhibernate courants avec mappage un-à-plusieurs

Image de PedidoVenda Tableau:

enter image description here

Image de ItemPedidoVenda Tableau:

enter image description here

je peux voir dans ces images que le problème est que l'identifiant de ItemPedidoVenda est l'une vers l'avant que PedidoVenda id. Mais ceci est sauvegardé automatiquement. Qu'est-ce qui peut être ça?

Mes propriétés dans les classes sont les suivantes:

public class PedidoVenda { 

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

public class ItemPedidoVenda { 

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

Les cartographes:

PedidoVendaMapper:

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

ItemPedidoVendaMapper:

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

Répondre

0

Lors de l'ajout d'un iTEMP edidoVenda instance à la liste des éléments dans PedidoVenda, vous devez vous assurer que vous définissez la propriété Pedido dans ItemPedidoVenda à l'instance correcte.

Je suis sûr que vous ne le faites pas.

Ce que je fais le plus souvent, c'est d'empêcher que l'utilisateur de mon API (le programmeur :)) ne puisse ajouter directement des éléments à la liste. Au lieu de cela, j'écris une méthode Addxxx qui ajoute des éléments à la liste.

À côté de cela, vous devez vous assurer que vous utilisez le bon type de collection. Je vous suggère un ensemble dans votre cas

Comme ceci:

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

}