2

Я использую 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 для игрока в этом файле.

Но разве мое картографирование не заботится об этом? С какой, по вашему мнению, проблема?

Заранее спасибо

Майк

ответ

2

Технически невозможно заглянуть внутрь тела метода в C-sharp. Поэтому FluentNhibernate не может этого сделать. Вы должны применить другую стратегию для моделирования своих сущностей и/или создания отображения самостоятельно.

+0

Что бы вы мне порекомендовали? – Mike

+1

'общественной IList PlayersNotInTeam (команда Team) { возвращение Session.Linq () .гд (список => roster.Team! = Команда) .Select (список => roster.Players) .Select (playerInTeam => playerInTeam.Player) .Distinct() .ToList() } ' EDIT: я не могу отформатировать код в комментарии? Я могу больше вариантов. Лучший вариант зависит от того, как ваши приложения используют ваш домен. Вот почему я не могу рекомендовать, что для вас лучше всего подходит. – Paco

+0

Спасибо за ваш код, но я не смог заставить его работать. Я тогда прибегал к HQL, и после небольшого количества исследований я мог это сделать. – Mike

1

hbm.xml файл ваше отображение. Итак, до тех пор, пока вы не сообщите NHibernate, что ваш класс Player имеет свойство Teams, NHibernate ничего об этом не знает.

Рядом с этим, почему у вас есть файл сопоставления hbm.xml и сопоставление с использованием Fluent? (Кажется, что файл hbm.xml имеет приоритет/предшествует отображению Fluent NH).

+2

Прошу FluentNhibernate генерировать файлы для меня. Так что это * Fluent NH mapping mapping *;) – Mike

Смежные вопросы