NHibernate.QueryException : could not resolve property

标签 nhibernate exception fluent-nhibernate nhibernate-mapping linq-to-nhibernate

我正在使用 FluentNHibernate 和 Linq To Nhibernate 以及这些实体(仅相关部分):

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, ) => (Not(.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>

事实上,我在该文件中没有 Player 的 Teams 属性。

但是我的映射不应该解决这个问题吗? 您认为问题出在哪里?

提前致谢

迈克

最佳答案

从技术上讲,不可能以升 C 语言查看方法体内部。所以 FluentNhibernate 也无法做到这一点。您必须应用不同的策略来对实体进行建模和/或自己生成映射。

关于NHibernate.QueryException : could not resolve property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3229436/

相关文章:

nhibernate - ConfORM Nhibernate OneToManyKeyColumnApplier 问题

.net - 多个同时保存导致 WCF/NHibernate "Row updated by another transaction"

exception - 导入错误 : No module named exceptions

c# - HibernateException : Could not create the driver from NHibernate. 驱动程序.MySqlDataDriver

c# - "The given key was not present in the dictionary"nHibernate C#

Java-如何在Junit中使用注解-eclipse

asp.net - 使用ninject时出现异常

.net - Fluent NHibernate 默认约定

c# - 流利的 NHibernate : How to have a one-to-many reference in both directions?

nhibernate - DB2 Fluent NHibernate 在 HasMany 映射中映射重复记录