Как ORM решает двунаправленные отношения между сущностями (например, NHibernate)? - PullRequest
0 голосов
/ 16 декабря 2009

Я пишу домашнее задание для своего класса RDBMS, мне нужно выполнить CRUD-операции в довольно простой области - чемпионате по киберспорту.
Студенты обязаны использовать ADO.NET. У меня вопрос, как я могу решить двунаправленные отношения, например, 1: m (каждый чемпионат имеет много матчей, но каждый матч принадлежит только одному точному чемпионату)? Мне кажется, что для этого должна быть какая-то техника.
И самое интересное для меня - как ORM, как EF или NHibernate, решает эту ситуацию?

Ответы [ 4 ]

1 голос
/ 16 декабря 2009

В NHibernate все довольно просто и понятно. Вот как будут выглядеть классы доменов, а затем - беглые отображения. Это предполагает, что вы будете использовать NHibernate для генерации вашей схемы. Если вы отображаете устаревшую базу данных, просто установить имена столбцов и имена таблиц.

public class Championship {
  public virtual int Id { get; set; }
  public virtual IList<Match> Matches { get; set; }
}


public class Match {
  public virtual int Id { get; set; }
  public virtual Championship Champioship { get; set; }
}


public class ChampionshipMap : ClassMap<Championship> {
  public ChampionshipMap() {
    Id(x => x.Id);
    HasMany(x => x.Matches);
  }
}


public class MatchMap : ClassMap<Match> {
  public MatchMap () {
    Id(x => x.Id);
    References(x => x.Championship);
  }
}
1 голос
/ 16 декабря 2009

Взгляните на Блог Дэви Брайона о создании собственного уровня доступа к данным. Он говорит обо всех подобных проблемах.

0 голосов
/ 17 декабря 2009

Например, в DataObjects.Net вы можете написать следующее, чтобы автоматически связать Championship.Matches набор сущностей и Match.Championship постоянное поле.

[HierarchyRoot]
public class Championship : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field, Association(PairTo="Championship")]
  public EntitySet<Match> Matches { get; private set; }
}

[HierarchyRoot]
public class Match : Entity
{
  [Field, Key]
  public int Id { get; set; }

  [Field]
  public Championship Championship { get; set; }
}
0 голосов
/ 16 декабря 2009

Для чего-то вроде многих ко многим в Hibernate вы определяете отношения. Вот пример (ссылка здесь :

<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <set name="addresses" table="PersonAddress">
        <key column="personId"/>
        <many-to-many column="addressId"
            class="Address"/>
    </set>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <set name="people" inverse="true" table="PersonAddress">
        <key column="addressId"/>
        <many-to-many column="personId"
            class="Person"/>
    </set>
</class>

Со стороны базы данных для связи «многие ко многим» у вас обычно будет таблица ссылок.

Итак, мы бы получили:

PERSON
ADDRESS
PERSON_ADDRESS

Таблица PERSON_ADDRESS будет содержать person_id и address_id, чтобы связать две сущности вместе. Таким образом, у одного человека может быть много адресов, и данный адрес может потенциально принадлежать более чем одному человеку или компании.

Для отношений 1: m достаточно иметь следующее:

PERSON
ADDRESS

В адресе у вас будет столбец person_id, но может быть много записей адресов для данного person_id, что дает вам возможность 1: m.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...