Я использую FluentNHibernate и Linq To NHibernate, с этими лицами (только соответствующие части):NHibernate.QueryException: не удалось разрешить свойству
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(); }
}
}
и согласующих отображений:
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();
}
}
у меня есть этот метод репозитория:
public IEnumerable<Player> PlayersNotInTeam(Team team)
{
return from player in Session.Linq<Player>()
where !player.Teams.Contains(team)
select player;
}
Который дает мне это исключение: NHibernate.Que ryException: не удалось разрешить свойство: Команды из: Emidee.CommonEntities.Player [.Where (NHibernate.Linq.NhQueryable`1 [Emidee.CommonEntities.Player], Quote ((player,) => (Not (.Contains (player. Команды, p1,)))))]
Я заглянул внутрь файла НВМ, порождена Fluent NHibernate, в отношении игрока, и вот что я получаю:
<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>
в самом деле, я не имеют свойства Teams для игрока в этом файле.
Но разве мое картографирование не заботится об этом? С какой, по вашему мнению, проблема?
Заранее спасибо
Майк
Что бы вы мне порекомендовали? – Mike
'общественной IList PlayersNotInTeam (команда Team) { возвращение Session.Linq () .гд (список => roster.Team! = Команда) .Select (список => roster.Players) .Select (playerInTeam => playerInTeam.Player) .Distinct() .ToList() } ' EDIT: я не могу отформатировать код в комментарии? Я могу больше вариантов. Лучший вариант зависит от того, как ваши приложения используют ваш домен. Вот почему я не могу рекомендовать, что для вас лучше всего подходит. –
Paco
Спасибо за ваш код, но я не смог заставить его работать. Я тогда прибегал к HQL, и после небольшого количества исследований я мог это сделать. – Mike