0

Juste pour l'enregistrement: J'utilise C#, Fluent NHibernate et MySQL 5.Fluent NHibernate Many-to-Many Mapping autoréférencement avec table associative

je l'habitude d'utiliser NHibernate pour ce projet, mais récemment j'ai décidé d'utiliser NHibernate à la place. Et j'ai eu un problème en mappant la relation many to many qui fait référence à soi avec une colonne supplémentaire.

J'ai la table article. L'élément peut contenir de nombreux composants qui sont également issus du tableau Article. Ces composants peuvent également être utilisés par d'autres éléments. Par exemple, l'élément A a besoin de deux composants, à savoir l'élément B et l'élément C. L'élément B est également utilisé pour l'élément D et l'élément E, et ainsi de suite.

J'ai utilisé la table associative et j'ai besoin de colonne supplémentaire pour leur relation. A cause de cela, il y aura 2 relations One-Many. C'est ma structure de base de données.

  1. Article
    • ID
    • Nom
  2. Condition préalable [Table Associatif]
    • ID
    • ITEM_ID [FK_Item1] // élément à réaliser.
    • Component_ID [FK_Item2] // composant pour cet article.
    • Poids // colonne supplémentaire.

Ceci est mon application pour le tableau Condition préalable:

public PrerequisiteMap() 
{ 
    Id(x => x.ID).GeneratedBy.Native(); 

    References(x => x.Item).Column("Item_ID"); 
    References(x => x.Component).Column("Component_ID"); 

    Map(x => x.Need); 
} 

Voici ma carte pour la table d'objet:

public ItemMap() 
{ 
    Id(x => x.ID).GeneratedBy.Native(); 

    HasMany(x => x.PrerequisitesParent).KeyColumn("Item_ID").Cascade.All(); 
    HasMany(x => x.PrerequisitesComponent).KeyColumn("Component_ID").Cascade.All ; 

    Map(x => x.Name); 
} 

Ceci est ma classe de pré-requis:

public virtual UInt64 ID { get; set; } 
// item. 
public virtual UInt64 Item_ID { get; set; } 
public virtual Item Item { get; set; } 
// Component. 
public virtual UInt64 Component_ID { get; set; } 
public virtual Item Component { get; set; } 

// prerequisite properties. 
public virtual float Need { get; set; } 

Et voici ma classe d'article:

// Item properties. 
public virtual UInt64 ID { get; protected set; } 
public virtual string Name { get; set; } 
public virtual IList<Prerequisite> PrerequisitesComponent { get; set; } 
public virtual IList<Prerequisite> PrerequisitesParent { get; set; } 

Le problème que j'ai est, à chaque fois que je tente de sauver/mise à jour Point avec préalable, la ID_composant et ITEM_ID ont toujours la même valeur.Je crée nouvel article X, avec des composants article Y et Z Point, dans le tableau préalable, je suis arrivé ces:

ID | ITEM_ID | ID_composant | Besoin

1 | X | X | 10

2 | X | X | Au lieu de, le résultat attendu

1 | X | Y | 10

2 | X | Z | 20

Ceci est mon morceau de code lors de l'enregistrement:

using (var session = SessionFactoryProvider.OpenSession()) 
    { 
     using (var trans = session.BeginTransaction()) 
     { 
      var item = session.Get<Item>((UInt64)1); // Item to be updated. 
      var item2 = session.Get<Item>((UInt64)2); // Component 1 
      var item3 = session.Get<Item>((UInt64)3); // Component 2 

      item.PrerequisitesComponent.Add(new Prerequisite() { Item = item, Component = item2, Need = 100f}); // adding new prerequisite from component 1 (item2) 
      item.PrerequisitesComponent.Add(new Prerequisite() { Item = item, Component = item3, Need = 100f }); // adding new prerequisite from component 2 (item3) 

      session.SaveOrUpdate(item); 
      try 
      { 
       trans.Commit(); 
      } 
      catch(GenericADOException ex) 
      { 
       MessageBox.Show(ex.InnerException.ToString()); 
      } 

     } 

    } 

Quel pourrait être le problème ici? Est-ce parce que je fais référence à la même table? ou peut-être que je l'ai cartographié à tort?

J'ai lu d'autres questions similaires many to many from product to product et many to many self referencing mais il semble qu'ils n'ont pas utilisé de colonne supplémentaire dans leur table associative?

Toute aide est très appréciée, merci.

Répondre

1

Silly Me .. J'ai utilisé la mauvaise référence pour l'article. J'ai changé item.PrerequisiteComponent en item.PrerequisiteParent et tout fonctionne bien.