代码之家  ›  专栏  ›  技术社区  ›  Emidee

NHibernate.QueryException:无法解析属性

  •  2
  • Emidee  · 技术社区  · 16 年前

    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.QueryException:无法解析属性:团队:Emidee.CommonEntities.Player[.Where(NHibernate.Linq.NhQueryable`1[Emidee.CommonEntities.Player],Quote((Player,)=>(不是(.Contains(player.Teams,p1,),)]

    我已经查看了由Fluent NHibernate生成的关于Player的hbm文件,下面是我得到的:

    <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 回复  |  直到 16 年前
        1
  •  2
  •   Paco    16 年前

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

        2
  •  1
  •   Frederik Gheysels    16 年前

    是你的地图吗 . 所以,只要你不告诉NHibernate你的Player类有一个Teams属性,NHibernate就什么都不知道。

    接下来,为什么要有一个hbm.xml映射文件和一个使用Fluent的映射文件? (hbm.xml文件似乎优先于Fluent NH映射)。