2010-01-05 3 views
1

Je possède ce mapping courant:NHibernate: pourquoi ma requête de profileur ne correspond-elle pas à ma cartographie fluide?

sealed class WorkPostClassMap : ClassMap<WorkPost> 
{ 
    public WorkPostClassMap() 
    { 
     Not.LazyLoad(); 

     Id(post => post.Id).GeneratedBy.Identity().UnsavedValue(0); 
     Map(post => post.WorkDone); 
     References(post => post.Item).Column("workItemId").Not.Nullable(); 
     References(Reveal.Property<WorkPost, WorkPostSheet>("Owner"), "sheetId").Not.Nullable(); 
    } 

classe parente:

sealed class WorkPostSheetClassMap : ClassMap<WorkPostSheet> 
{ 
    public WorkPostSheetClassMap() 
    { 
     Id(sheet => sheet.Id).GeneratedBy.Identity().UnsavedValue(0); 
     Component(sheet => sheet.Period, period => 
              { 
               period.Map(p => p.From, "PeriodFrom"); 
               period.Map(p => p.To, "PeriodTo"); 
              }); 
     References(sheet => sheet.Owner, "userId").Not.Nullable(); 
     HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList(); 
    } 

classe WorkItem:

sealed class WorkItemClassMap : ClassMap<WorkItem> 
{ 
    public WorkItemClassMap() 
    { 
     Not.LazyLoad(); 

     Id(wi => wi.Id).GeneratedBy.Assigned(); 
     Map(wi => wi.Description).Length(500); 
     Version(wi => wi.LastChanged).UnsavedValue(new DateTime().ToString()); 
    } 
} 

Et quand une collection de WorkPosts sont paresseux chargés du travail possédante feuille de poste Je reçois l'instruction de sélection suivante:

SELECT workposts0_.sheetId as sheetId2_, 
     workposts0_.Id as Id2_, 
     workposts0_.idx as idx2_, 
     workposts0_.Id as Id2_1_, 
     workposts0_.WorkDone as WorkDone2_1_, 
     workposts0_.workItemId as workItemId2_1_, 
     workposts0_.sheetId as sheetId2_1_, 
     workitem1_.Id as Id1_0_, 
     workitem1_.LastChanged as LastChan2_1_0_, 
     workitem1_.Description as Descript3_1_0_ 

FROM "WorkPost" workposts0_ 
     inner join "WorkItem" workitem1_ on workposts0_.workItemId=workitem1_.Id 

WHERE [email protected];@p0 = 1 

Non, il y a une ou deux choses qui ne fait pas me sence:

  1. La workpost propriété « Id » se produit deux fois dans l'instruction select
  2. Il y a une sélection d'une colonne se référant à nommé "idx" mais cette colonne ne fait partie d'aucun mappage fluide.

Toute personne qui peut aider à faire la lumière sur ce sujet?

+0

Pouvez-vous confirmer la déclaration de la propriété 'WorkPosts' de' WorkPostSheet'? –

+1

Veuillez également fournir le mappage WorkItem. –

+0

Merci pour la réponse rapide, mais je n'ai pas compris ce que vous vouliez que je confirme. Pouvez-vous être un peu plus précis? – Marius

Répondre

1

La colonne idx figure dans la liste de sélection car vous avez mappé Sheet.WorkPosts en tant que liste ordonnée. La colonne idx est requise pour définir l'ordre des éléments dans la liste. Je ne suis pas sûr pourquoi la propriété id est dans l'instruction select deux fois. Soit dit en passant, une valeur non enregistrée de 0 est la valeur par défaut pour les champs d'identité, de sorte que vous pouvez supprimer .UnsavedValue(0) si vous le souhaitez.

Questions connexes