NHibernate: отображение свойств IList - PullRequest
4 голосов
/ 22 марта 2010

У меня есть следующие таблицы Order, Transaction, Payment. Класс Order имеет некоторые свойства:

public virtual Guid Id { get; set; }
public virtual DateTime Created { get; set; }
...

и я добавил еще два:

public virtual IList<Transaction> Transactions { get; set; }
public virtual IList<Payment> Payments { get; set; }

Как сохранить списки (отношения) Transactions и Payments в базе данных?

Ответы [ 4 ]

7 голосов
/ 31 марта 2010

См. отображение коллекции в справочной документации.Существует несколько способов сопоставления свойства IList.

A bag - это неупорядоченная неиндексированная коллекция, которая может содержать один и тот же элемент несколько раз.

<bag name="Transactions" lazy="true" table="Transaction" >
    <key column="OrderId"/>
    <one-to-many class="Transaction"/>
</bag>

set - неупорядоченная, неиндексированная коллекция, содержащая уникальные элементы.

<set name="Transactions" lazy="true" table="Transaction" >
    <key column="OrderId"/>
    <one-to-many class="Transaction"/>
</set>

A list - упорядоченная и проиндексированная коллекция, которая может содержать один и тот же элемент несколько раз.

<list name="Transactions" lazy="true" table="Transaction" >
    <key column="OrderId"/>
    <index column="ordering"/>
    <one-to-many class="Transaction"/>
</list>

NHibernate может возвращать неупорядоченные коллекции в отсортированном порядке, используя атрибут sort .

Никакое обсуждение отображения коллекции не завершено без упоминания каскад .Это позволяет применять операции над родительским объектом к объектам коллекции.

  • Обычно не имеет смысла включать каскад для ассоциации <many-to-one> или <many-to-many>.Каскад часто полезен для ассоциаций <one-to-one> и <one-to-many>.
  • Если срок жизни дочернего объекта ограничен сроком жизни родительского объекта, сделайте его объектом жизненного цикла, указав cascade = "all-delete-orphan ".
  • В противном случае вам может вообще не понадобиться каскад.Но если вы думаете, что вы часто будете работать с родителем и потомками вместе в одной транзакции и хотите сэкономить немного времени на наборе текста, рассмотрите возможность использования cascade = "persist, merge, save-update"
1 голос
/ 22 марта 2010

Если вы управляете базой данных, то одной из радостей использования NHib является то, что он создаст для вас базу данных, включая внешние ключи, которые вам необходимы для ведения там ваших списков. Для этого используйте код ниже:

            try
        {
            var schema = new SchemaExport(cfg);
            schema.Drop(false, true);
            schema.Create(true, true);
        }
        catch (Exception ex)
        {
            Console.WriteLine(@"Schema Export Error Message: {0}", ex);
        }

где cfg - ваш объект конфигурации NHibernate.

Дайте нам знать, если это решит вашу проблему, или вы задаете другой вопрос.

Berryl

0 голосов
/ 31 марта 2010

разобрался с рабочим решением для меня. В файл сопоставления я добавил:

<bag name="Transactions" lazy="true" table="Transaction" >
    <key column="OrderId"/>
    <one-to-many class="Transaction"/>
</bag>

<bag name="Payments" lazy="true" table="Payment">
    <key column="OrderId"/>
    <one-to-many class="Payment"/>
</bag>
0 голосов
/ 22 марта 2010

Я не уверен, что вы спрашиваете. Предполагая, что Transactions и Payments уже сопоставлены в nhibernate, вам нужно добавить опцию каскада в сопоставления ассоциаций для Order .. В беглом nhibernate что-то вроде этого:

References(x => x.Payments)
    .Cascade.All
...

Это гарантирует, что при добавлении транзакций / платежей в заказ они сохраняются.

1010 * редактировать *

Независимо от того, используете ли вы свободно используемый nhibernate, каскадирование - это вариант, который (я думаю) вам нужен. Документы nhibernate для сопоставления коллекций здесь .

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