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
Que me recommanderiez-vous de faire? – Mike
'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
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