NHibernate, не сохраняющийся many-many отношения

Цель Lambda по сравнению с AWS EC2 - упростить создание небольших приложений по требованию, которые реагируют на события и новую информацию.

Если ваша партия работает в течение 15 минут, вы можете использовать лямбда-функцию.

Но если вы хотите, чтобы пакетная обработка выполнялась, вам следует проверить AWS Batch. Серия AWS .

Здесь хорошая статья о демонстрации использования пакета aws.

7
задан efdee 30 December 2008 в 12:49
поделиться

8 ответов

@efdee

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

Хорошо оказалось, что это не Быстрый NHibernate, ни отображение, но я не понимающий, как NHibernate работает с many-many. В many-many отношениях, если наборы на обоих объектах не заполняются, NHibernate не сохраняет данные к таблице ссылки.

Скажем, у меня есть это объекты в many-many отношениях:


partial class Contact
{
   public string ContactName {get; set;}
   public IList Locations {get; set;}

}

partial class Location
{
   public string LocationName {get; set;}
   public string LocationAddress {get;set;}
   public IList Contacts {get;set;}
}

когда я добавляю к местоположению для Контакта. Местоположения, я должен удостовериться, что контакт является также существующим внутренним местоположением. Контакты.

таким образом для добавления местоположения у меня есть этот метод в моем классе Контакта.


public void AddLocation(Location location)
        {
            if (!location.Contacts.Contains(this))
            {
                location.Contacts.Add(this);
            }
            Locations.Add(location);
        }

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

Это - сообщение, которое указало на меня для проверки обоих наборов: http://www.coderanch.com/t/217138/Object-Relational-Mapping/link-table-of-ManyToMany-annotation

8
ответ дан 6 December 2019 в 08:17
поделиться

Я не уверен, как Вы делаете это с Быстрым NHibernate, но необходимо установить опцию Cascade на сумке (TripItems). Как обычно, у Ayende есть полезное сообщение о каскадных опциях.

От быстрого Google я предложил бы, чтобы Вы попробовали:

HasManyToMany<TripItem2>(x => x.TripItems).AsBag()
        .WithTableName("TripItems_TripItemAttributeValues_Link")
        .WithParentKeyColumn("TripItemAttributeValueId")
        .WithChildKeyColumn("TripItemId")
        .LazyLoad()
/*-->*/ .Cascade.All(); /*<-- this is the bit that should make it work */
2
ответ дан 6 December 2019 в 08:17
поделиться

У David Kemp есть он правильный: Вы хотите добавить каскад к своей сумке.

Я всегда отредактировал рукой (и создавал из руки), отображающиеся файлы, таким образом, мой естественный наклон состоит в том, чтобы поместить его там. Можно сделать это следующим образом:

<bag name="TripItems" lazy="true" table="TripItems_TripItemAttributeValues_Link" cascade="all">
  <key column="TripItemAttributeValueId" />
  <many-to-many column="TripItemId" class="ETP.Core.Domain.TripItem2, ETP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

Я нашел, что хранение моих классов 'чистый' и хранение всего, чтобы сделать с nHibernate в файле .hbm.xml сохраняют мой инструмент для очистки решения. Тот путь, если существует новое программное обеспечение ORM, которое я хочу использовать, я просто, заменяет отображающиеся файлы и не переписывает классы. Мы используем наши Модульные тесты, чтобы протестировать классы и дать тестируемость xml, хотя мне действительно отчасти нравятся методы Быстрого NHIBERNATE.

1
ответ дан 6 December 2019 в 08:17
поделиться

Я - испуганный Каскад. Все () не являются действительно решением моей проблемы - это была одна из вещей, которые я попробовал. Проблема не состоит в том, что объекты, добавленные к набору, не сохраняются - они уже находятся в базе данных в то время, когда они добавляются к набору. Это просто, что записи в таблице ссылки не создаются. Кроме того, я думаю Каскад. Все () также заставили бы дочерние объекты быть удаленными, который не является желательным поведением в моем сценарии. Я попытался использовать Каскад. SaveUpdate (), но как я указал, это решает что-то, что не является действительно моей проблемой :-)

Однако для проверки я повторю это решение и сообщу результат.

Что касается хранения чистых классов, это - 100% случай с Быстрым NHibernate. Отображения класса, которые Вы создаете, являются файлами кода C#, которые идут вместе с Вашими классами объекта, в значительной степени как .hbm.xml, файлы были бы.

0
ответ дан 6 December 2019 в 08:17
поделиться

I've got it and I hope this helps someone else out there. The issue is that I had inverse='true' on both bags. If you read the excerpt below you'll note that there needs to be inverse set to true on only one of the bags:

Note the use of inverse="true". Once again, this setting tells NHibernate to ignore changes made to the categories collection and use the other end of the association - the items collection - as the representation that should be synchronized with the database.

1
ответ дан 6 December 2019 в 08:17
поделиться

У меня точно такая же проблема, но я использовал NHibernate.JetDriver. Я безуспешно пытался использовать рекомендованный ответ. Кто-нибудь знает, есть ли у NHibernate.JetDriver ограничение по отношению к многим ко многим?

Вот мои файлы hbm на тот случай, если кому-то захочется на мгновение их просмотреть:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Ace.Docs.Core.Domain" assembly="Ace.Docs.Core">
<class name="Ace.Docs.Core.Domain.Address, Ace.Docs.Core" table="Addresses" lazy="true">
    <id name="Id" column="ID">
        <generator class="identity" />
    </id>
    <property name="Address1" column="Address1" />
    <property name="Address2" column="Address2" />
    <property name="City" column="City" />
    <property name="EmailAddress" column="EmailAddress" />
    <property name="Phone1" column="Phone1" />
    <property name="Phone2" column="Phone2" />
    <property name="PostalCode" column="PostalCode" />
    <property name="StateOrProvince" column="StateOrProvince" />
    <many-to-one name="AddressTypeMember" column="AddressTypeID" class="AddressType" />
    <bag name="HasPersonalInfo" table="Link_PersonalInfo_Addresses" lazy="true" cascade="save-update" inverse="true" >
        <key column="AddressID"></key>
        <many-to-many column="PersonalInfoID" class="PersonalInfo" />
    </bag>
</class>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Ace.Docs.Core.Domain" assembly="Ace.Docs.Core">
<class name="Ace.Docs.Core.Domain.PersonalInfo, Ace.Docs.Core" table="PersonalInfo" lazy="true">
    <id name="Id" column="ID">
        <generator class="identity" />
    </id>
    <property name="Prefix" column="Prefix" />
    <property name="FirstName" column="FirstName" />
    <property name="MiddleName" column="MiddleName" />
    <property name="LastName" column="LastName" />
    <property name="SIN" column="SIN" />
    <property name="Birthdate" column="Birthdate" />
    <property name="Note" column="Notes" />
    <bag name="HasAddress" table="Link_PersonalInfo_Addresses" lazy="true" cascade="save-update" inverse="true" >
        <key column="PersonalInfoID"></key>
        <many-to-many column="AddressID" class="Address" />
    </bag>
</class>

1
ответ дан 6 December 2019 в 08:17
поделиться

Я тоже боролся с этим, и у меня была совсем другая причина моих проблем. В моем примере, если бы у меня был объект без каких-либо отношений «многие ко многим», я мог бы просто вызвать saveOrUpdate, и все было бы хорошо. Но если у меня были какие-либо отношения «многие ко многим», я должен был убедиться, что мой вызов saveOrUpdate находится в пределах BeginTransaction и CommitTransaction. Я новичок в использовании Nhibernate, поэтому извиняюсь, если это очевидно. Но не для меня.

0
ответ дан 6 December 2019 в 08:17
поделиться

Вызовите Session.Flush () или используйте транзакцию.

7
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: