nhibernate - критерии через промежуточную таблицу - PullRequest
0 голосов
/ 06 января 2012

У меня есть стол Team и у меня есть стол Location. У каждой команды может быть несколько локаций, и в каждой локации может быть несколько команд, так что это отношение многих ко многим.

Когда этот сценарий создается в базе данных, будет 3 таблицы: Team, Location и TeamLocation для хранения ссылок «многие ко многим».

Я сопоставил это в nhibernate, используя следующее ... Team.hbm.xml

<class name="App.Data.Entities.Team,App.Data.Entities" table="`Team`" lazy="true">
   <id name="Teamid" column="`TeamID`" type="Guid">
      <generator class="assigned" />
    </id>
    <property type="string" not-null="true" length="250" name="TeamName" column="`TeamName`" />
    <bag name="TeamLocations" inverse="false" table="`TeamLocations`" lazy="true" cascade="all">
      <key column="`TeamID`" />
      <many-to-many class="App.Data.Entities.Location,App.Data.Entities">
        <column name="`LocationID`" />
      </many-to-many>
    </bag>
    </class>

и Location.hbm.xml

<class name="App.Data.Entities.Location,App.Data.Entities" table="`Location`" lazy="true">
    <id name="Locationid" column="`LocationID`" type="int">
      <generator class="native" />
    </id>
    <property type="string" not-null="true" length="250" name="LocationName" column="`LocationName`" />
    <property type="string" length="1000" name="Address" column="`Address`" />
    <bag name="Teams" inverse="false" table="`TeamLocations`" lazy="true" cascade="all">
      <key column="`LocationID`" />
      <many-to-many class="App.Data.Entities.Team,App.Data.Entities">
        <column name="`TeamID`" />
      </many-to-many>
    </bag>
  </class>

Теперь я пытаюсь получить все команды, которые базируются в определенном месте, используя API критериев, что я не могу ..

Эквивалент sql ...

SELECT     Team.TeamName, Location.LocationName
FROM         Team INNER JOIN
                      TeamLocations ON Team.TeamID = TeamLocations.TeamID INNER JOIN
                      Location ON TeamLocations.LocationID = Location.LocationID
WHERE     (TeamLocations.LocationID = 2) 

и в коде asp.net

ICriteria criteria = _session.CreateCriteria(typeof(Team)).SetFirstResult(startRowIndex).SetMaxResults(maximumRows);

if (deptID > 0)
{
    Department dept = new Department(deptID);
    criteria.Add(Expression.Eq(Team.PropertyNames.Department, dept)); //for department, which works fine.
}

if (locationIDs.Count > 0)
{
    List<Location> locations = new List<Location>();

    foreach (int locationID in locationIDs)
    {
        Location loc = new Location(locationID);
        locations.Add(loc);
    }

    criteria.CreateCriteria("TeamLocations").Add(Expression.Eq(""TeamLocations"", locations));
}

return criteria.List<Team>();

Это выбрасывает и ошибка ..

could not resolve property: TeamLocations of: App.Data.Entities.Location 

что я не могу понять, чтобы понять: (

Поправь меня .. Спасибо!

1 Ответ

1 голос
/ 06 января 2012

Вы можете добавить ограничение к пути ассоциации, используя CreateCriteria или CreateAlias ​​, как я сделал ниже. Мне нужно было бы узнать больше о вашей модели и сопоставлении, чтобы понять, почему вы можете добавить ограничение для Team.PropertyNames.Department без его псевдонима.

    ICriteria criteria = _session.CreateCriteria(typeof(Team)).SetFirstResult(startRowIndex).SetMaxResults(maximumRows);

if (deptID > 0)
{
    Department dept = new Department(deptID);
    criteria.Add(Expression.Eq(Team.PropertyNames.Department, dept)); //for department, which works fine.
}

if (locationIDs.Count > 0)
{
    // you may need to convert locationIds to an ICollection e.g.
    // var ids = locationIds.ToArray();
    criteria.CreateAlias("TeamLocations", "teamLocations");
    criteria.Add(Restrictions.In("teamLocations.LocationId", locationIds));
}

return criteria.List<Team>();
...