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)))))]

我看了HBM的文件中,通过功能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> 

事实上,我在该文件中没有球员属性。

但我的地图不应该照顾这个吗? 你认为这个问题在哪里?

在此先感谢

迈克

回答

2

从技术上讲,无法在C-sharp中查看方法体。所以FluentNhibernate也无法做到这一点。您必须应用不同的策略来模拟您的实体和/或自己生成映射。

+0

你会推荐我做什么? – Mike 2010-07-12 15:35:14

+1

'公共IList的 PlayersNotInTeam(队队) { 回报Session.Linq () 。凡(名单=> roster.Team!=队) 。选择(名单=> roster.Players) 。选择(playerInTeam => playerInTeam.Player) .Distinct() .ToList() }' 编辑:我无法格式化评论中的代码? 我可以有更多的选择。最好的选择取决于你的应用程序如何使用你的域名。这就是为什么我不能推荐什么是你最好的选择。 – Paco 2010-07-12 20:56:03

+0

感谢您的代码,但我无法完成工作。 我已经使用HQL,经过一些研究后,我可以做到。 – Mike 2010-07-13 15:23:06

1

的hbm.xml文件中是你的映射。所以,只要你不通知NHibernate你的Player类有一个Teams属性,NHibernate不知道任何关于它的信息。

接下来,为什么你有一个hbm.xml映射文件,并使用Fluent的映射? (看起来hbm.xml文件具有优先权/先于Fluent NH映射)。

+2

我要求FluentNhibernate为我生成文件。所以这是*流利NH的映射*;) – Mike 2010-07-12 14:52:56

相关问题