2010-04-04 4 views
1

J'ai rencontré le problème suivant. Dans mon application utilise les entités Owner et Area liant autant à beaucoup.NHibernate many-to-many avec élément composite

public class Area : DomainObject<int> {   
    private ISet<OwnersPeriod> _owners = new HashedSet<OwnersPeriod>(); 

    public ICollection<OwnersPeriod> Owners { 
     get { return _owners; } 
     set { 
      Check.Require(value != null); 
      _owners = new HashedSet<OwnersPeriod>(value); 
     } 
    } 
} 

Table Owner2Area a les champs suivants:

CREATE TABLE [dbo].[Owner2Area](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [IDOwner] [int] NOT NULL, 
    [IDArea] [int] NOT NULL, 
    [FirstDate] [datetime] NOT NULL, 
    [LastDate] [datetime] NULL, 
CONSTRAINT [PK_Owner2Area] PRIMARY KEY CLUSTERED) 

correspond donc à la classe OwnersPeriod

public class OwnersPeriod { 
     private Owner _member; 
     private Area _area;  
     public Owner Owner { get {...} set{...} }  
     public Area Area { get { ... } set { ... } }  
     public DateTime FirstDate { get; set; }  
     public DateTime? LastDate { get; set; }  
    } 

j'ai écrit cartographies

<class lazy="false" name="Core.Domain.Area, Core" table="Areas"> 
    ... 
    <set name="Owners" table="Owner2Area" inverse="true" lazy="true" > 
     <key column="IDArea"/> 
     <composite-element class="Core.Domain.OwnersPeriod, Core" > 
     <parent name="Area" /> 
     <property name="FirstDate" type="datetime"/> 
     <property name="LastDate" type="datetime"/> 
     <many-to-one name="Owner" class="Core.Domain.Owner, Core" column="IDOwner"/> 
     </composite-element> 
    </set> 
</class> 

Pour chaque zone de données existantes sont suc mis à jour dans Owners, mais lorsque j'ajoute un nouvel enregistrement dans Owner2Area à CreateSQLQuery, ces données ne sont pas mises à jour par exemple de zone. Si j'ai rouvert le formulaire et obtenu toutes les zones, le lien ajouté a été chargé avec succès dans la collection.
Comment peut être forcé de charger ajouté ainsi enregistrement de relation plusieurs-à-plusieurs?
Nhibernate v.2.0.1, db MSSQL 2005

Répondre

0

Si vous utilisez createSQLQuery NHibernate ne sait pas ce que vous avez fait. Pensez-y juste une minute. CreateSQLQuery a été ajouté car tout n'est pas possible avec HQL et CriteriaQuery. Donc, avec CreateSQLQuery, vous faites des choses spéciales. Un nombre "plusieurs-à-plusieurs" n'est pas recommandé, car vous n'avez pas de "gestion directe" de la "table du milieu". Si vous ajoutez une entité many-to-many à la manière nhibernate (en modifiant une collection) et en effectuant une mise à jour de l'entité, vous verrez que nhibernate supprime toutes les données de la 'middle table' puis les insère encore. Donc pas bien. C'est pourquoi vous avez probablement pensé que vous feriez une solution de contournement en utilisant CreateSQLQuery. Je vous suggère de faire une relation parent-enfant classique avec 3 entités, donc vous pouvez directement manipuler la 'table du milieu'.

L'autre solution est que lorsque vous mettez à jour la 'table du milieu' vous faites une expulsion (c'est une méthode de ISession et une méthode dans ISessionFactory, consultez le manuel) de l'entité affectée par CreateSQLQuery. Mais utiliser ceci forcera un autre hit à une base de données (une nouvelle version sera chargée). L'utilisation de l'approche parent-enfant n'apportera aucun succès à une base de données.

+0

Merci. J'ai remarqué que NH effectue des enregistrements d'insertion et de suppression. J'ai ajouté un mapping 'inverse =" true "', utilisé uniquement select. Décision avec 'Evict' faisant ce dont j'ai besoin. Peut-être que la vie ne m'apprend pas, mais la solution avec le plusieurs-à-plusieurs semble bien. =) –

Questions connexes