2

J'utilise FluentNHibernate et LINQ Pour Nhibernate, avec ces entités (seules les parties pertinentes):NHibernate.QueryException: ne pouvait pas résoudre la propriété

public class Player : BaseEntity<Player> 
{ 
    private readonly IList<PlayerInTeam> allTeams = new List<PlayerInTeam>(); 

    public IEnumerable<Team> Teams 
    { 
     get 
     { 
      return from playerInTeam in allTeams 
        where playerInTeam.Roster.Match == null 
        select playerInTeam.Roster.Team; 
     } 
    } 
} 

public class PlayerInTeam : BaseEntity<PlayerInTeam> 
{ 
    public int PlayerNumber { get; set; } 
    public Player Player { get; set; } 
    public Position Position { get; set; } 
    public Roster Roster { get; set; } 
} 

public class Roster : BaseEntity<Roster> 
{ 
    private readonly IList<PlayerInTeam> players = new List<PlayerInTeam>(); 

    public Team Team { get; set; } 
    public IEnumerable<PlayerInTeam> Players { get { return players; } } 
} 

public class Team : BaseEntity<Team> 
{ 
    private readonly IList<Roster> allRosters = new List<Roster>(); 

    public Team(string name, Sex sex) 
    { 
     allRosters.Add(new Roster(this)); 
    } 

    public Roster DefaultRoster 
    { 
     get { return allRosters.Where(r => r.Match == null).First(); } 
    } 
} 

et les applications correspondantes:

public class PlayerMap : ClassMap<Player> 
{ 
    public PlayerMap() 
    { 
     HasMany<PlayerInTeam>(Reveal.Member<Player>("allTeams")) 
      .Inverse() 
      .Cascade.AllDeleteOrphan() 
      .Access.CamelCaseField(); 
    } 
} 

public class PlayerInTeamMap : ClassMap<PlayerInTeam> 
{ 
    public PlayerInTeamMap() 
    { 
     References(pit => pit.Player) 
      .Not.Nullable(); 

     References(pit => pit.Roster) 
      .Not.Nullable(); 
    } 
} 

public class RosterMap : ClassMap<Roster> 
{ 
    public RosterMap() 
    { 
     References(tr => tr.Team) 
      .Not.Nullable(); 

     HasMany<PlayerInTeam>(Reveal.Member<Roster>("players")) 
      .Inverse() 
      .Cascade.AllDeleteOrphan() 
      .Access.CamelCaseField(); 
    } 
} 

public class TeamMap : ClassMap<Team> 
{ 
    public TeamMap() 
    { 
     HasMany<Roster>(Reveal.Member<Team>("allRosters")) 
      .Inverse() 
      .Cascade.AllDeleteOrphan() 
      .Access.CamelCaseField(); 
    } 
} 

J'ai cette méthode de dépôt:

public IEnumerable<Player> PlayersNotInTeam(Team team) 
{ 
    return from player in Session.Linq<Player>() 
      where !player.Teams.Contains(team) 
      select player; 
} 

ce qui me donne cette exception: NHibernate.Que ryException: impossible de résoudre la propriété: Les équipes de: Emidee.CommonEntities.Player [.Where (NHibernate.Linq.NhQueryable`1 [Emidee.CommonEntities.Player], Citation ((player,) => (Not (.Contains (joueur. les équipes, p1,)))))]

J'ai regardé à l'intérieur du fichier HBM, généré par Fluent NHibernate, en ce qui concerne Player, et voici ce que je reçois:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true"> 
    <class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Emidee.CommonEntities.Player, Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=65c7ad487c784bec" table="Players"> 
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <column name="Id" /> 
     <generator class="increment" /> 
    </id> 
    <bag access="field.camelcase" cascade="all-delete-orphan" inverse="true" name="allTeams" mutable="true"> 
     <key> 
     <column name="Player_id" not-null="true" /> 
     </key> 
     <one-to-many class="Emidee.CommonEntities.PlayerInTeam, Emidee.CommonEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=65c7ad487c784bec" /> 
    </bag> 
    </class> 
</hibernate-mapping> 

en effet, je ne possède pas de propriété Teams pour Player dans ce fichier.

Mais ma cartographie ne devrait-elle pas s'occuper de cela? Où pensez-vous que le problème est?

Merci à l'avance

Mike

Répondre

2

Techniquement, il n'est pas possible de regarder à l'intérieur d'un corps de méthode en C-sharp. Donc FluentNhibernate ne peut pas faire ça aussi. Vous devez appliquer une stratégie différente pour modéliser vos entités et/ou générer le mappage vous-même.

+0

Que me recommanderiez-vous de faire? – Mike

+1

'publique IList PlayersNotInTeam (équipe Team) { retour Session.Linq () .Lorsque (liste => roster.Team! = Équipe) .Choisir (liste => roster.Players) .Choisir (playerInTeam => playerInTeam.Player) .Distinct() .ToList() } ' EDIT: Je ne peux pas mettre en forme le code dans le commentaire? Je peux plus d'options. La meilleure option dépend de la manière dont vos applications utilisent votre domaine. C'est pourquoi je ne peux pas recommander quelle est la meilleure option pour vous. – Paco

+0

Merci pour votre code, mais je ne pouvais pas le faire fonctionner. J'ai alors eu recours à HQL, et après quelques recherches, j'ai pu le faire. – Mike

1

Le fichier hbm.xml est votre cartographie. Donc, tant que vous n'informez pas NHibernate que votre classe Player a une propriété Teams, NHibernate n'en sait rien.

À côté de cela, pourquoi avez-vous un fichier de mappage hbm.xml et un mappage avec Fluent? (Il semble que le fichier hbm.xml soit prioritaire/précède le mappage NH Fluent).

+2

Je demande à FluentNhibernate de générer les fichiers pour moi. Donc, c'est * Mappage de NH fluide *;) – Mike

Questions connexes