powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate - как создать связь один-к-одному?
5 сообщений из 5, страница 1 из 1
NHibernate - как создать связь один-к-одному?
    #37365858
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день,
Интересуюсь мнением специалистов,

Мы хотим сделать в NH следующее:

У объекта есть коллекция подобъектов, замаплена как 1:М bidirectional, с одной стороны Cascade.All(), с другой Inverse()

Есть поле в объекте - текущий подобъект из коллекции. Мы хотим, чтобы это все мапилось. Притом создаются сразу 2 несохраненных объекта: главный и один подобъект. Таким образом, сначала в коллекции один элемент. Поле "текущий" смотрит на него же.

А потом пытаемся сохранить. NH выдает ошибку:
not-null property references a null or transient value <lalal>

Так как у главного объекта 2 поля: "текущий эл" (reference, not null, он-то и выдает ошибку) и "коллекция".
А у подобъекта одно поле "родитель", оно связано с коллекцией.

Когда ставим полю "текущий эл" not-null, все работает и сохраняется. Но это же нехорошо - реально оно никогда не null, просто иногда указывает на несохраненный объект.

Вот маппинги, типы я назвал Main и Sub
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Main
    <set access="field.camelcase" cascade="save-update" inverse="true" name="Subs" mutable="true">
      <key foreign-key="FK_Main_Sub">
        <column name="MainId" not-null="true" />
      </key>
      <one-to-many class="Sub, , Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </set>

Main
    <many-to-one cascade="all" class="Sub, , Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
          foreign-key="FK_Main_CurrentSub" name="CurrentSub">
      <column name="CurrentSubId" not-null="true" />
    </many-to-one>

Sub
    <many-to-one cascade="save-update" class="Main, , Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
         foreign-key="FK_Sub_Main" name="Main">
      <column name="MainId" not-null="true" />
    </many-to-one>


Вот маппинги Fluent
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Main
            // С добавления этого поля и начались беды
            References(x => x.CurrentSub).Column("CurrentSubId").Cascade.All().Not.Nullable();

            HasMany(x => x.Subs).AsSet().Access.CamelCaseField().Inverse().Cascade.SaveUpdate();

Sub
            // Без Not Nulable все ОК, но я думаю, что его удастся сохранить, только вот как это сделать?
            References(x => x.Main).Column("MainId").Not.Nullable();



Черные стрелочки - коллекция, зеленые - элементы коллекции указывают на родителя, так как Inverse, то за сохранение отвечает именно поле с зеленой стрелочкой (по его значению судят о вхождении или невхождении элемента в коллекцию, а не по черной стрелке), синяя - текущий элемент коллекции, вот когда я ее добавил, проблемы и возникли. Как замапить такую ситуацию в NHibernate ?? Ведь здесь есть гуру, я точно знаю! :)
...
Рейтинг: 0 / 0
NHibernate - как создать связь один-к-одному?
    #37365961
stimpi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
зачем вам bidirectional ???
выкиньте его нафиг, это туго потдерживается
...
Рейтинг: 0 / 0
NHibernate - как создать связь один-к-одному?
    #37366021
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NHibernate_User_,

код классов давайте, и как сохраняете.
...
Рейтинг: 0 / 0
NHibernate - как создать связь один-к-одному?
    #37366453
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SolYUtor,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
class Main
        public virtual Sub CurrentSub { get; protected set; }

        public virtual IEnumerable<Sub> Subs
        {
            get { return new ImmutableSet<Sub>(subs); }
        }
        private Iesi.Collections.Generic.ISet<Sub> subs;


class Sub
        /// Main, к которому относится данный Sub
        public virtual Main Main{ get; protected internal set; }


На момент сохранения Sub указывает на Main, коллекция внутри Main состоит из 1 элемента Sub, и на него же указывает поле CurrentSub.

Сохраняем просто, через UnitOfWork. К сожалению, его писал не я.
...
Рейтинг: 0 / 0
NHibernate - как создать связь один-к-одному?
    #37366457
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для меня это выглядит как

public void Save(Main entity)
{
CurrentSession.SaveOrUpdate(entity);
}

один раз вызывается.

UPD: ошибся, никакого UnitOfWork в данном случае не вызывается.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate - как создать связь один-к-одному?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]