Свободно владеет NHibernate. Автоматическое сопоставление и условные обозначения

Я новичок в NHibernate, его конфигурационный аспект всегда казался мне слишком обременительным. Вчера я познакомился с функциями автоматического сопоставления в Fluent NHibernate и был впечатлен.

Чтобы получить образование, я поставил перед собой задачу попробовать «Первый проект для начала» (http://wiki.fluentnhibernate.org/show/GettingStartedFirstProject) с использованием AutoMappings и соглашений. Я должен признать, что мне не очень повезло.

Подводя итог моим шагам:

Я внес некоторые незначительные изменения в схему базы данных в этом примере, главным образом для удаления подчеркивания из внешних ключей (например, от Product_id до ProductId), так как это приведет его в соответствие с нашими стандартами именования баз данных.

Q1) Я попытался написать реализацию IHasManyConvention, используя ForeignKeyConvention в качестве примера, но метод WithKeyColumn, похоже, не существует (я предполагаю, что это связано с тем, что я загрузил вчерашнюю сборку, поэтому впоследствии дизайн изменился с момента написания статьи). Как мне это исправить?

Я также внес некоторые незначительные изменения в слой Entities в этом примере, поскольку я думал, что это упростит задачу, они должны были переименовать StoresStockedIn в Stores (Product.cs) и Staff в Employees (Store.cs).

Мой код выглядит так:

var cfg = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
    .ConnectionString(c => c
        .Is(connectionString)))
.Mappings(m => m.AutoMappings.Add(
                AutoPersistenceModel.MapEntitiesFromAssemblyOf<Store>()
                    .Where(t => t
                        .Namespace == "FluentNHibernateTesting.Entities")
                        .ConventionDiscovery.Setup(c => c.Add<ForeignKeyConvention>())
                ))
.BuildSessionFactory();

Затем я пытаюсь добавить магазины, продукты и сотрудников в базу данных в соответствии с примером начала работы. Исключение, которое я получаю, происходит при фиксации:

объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом. Тип: FluentNHibernateTesting.Entities.Employee, Entity: FluentNHibernateTesting.Entities.Employee

Q2) Как мне решить эту проблему? Я понимаю (из моего ограниченного чтения), что это как-то связано с правильной настройкой каскадных элементов объектных отношений, но я немного озадачен, как это сделать эффективно с помощью Auto Mapping.

Q3) Есть ли целевая дата выпуска проекта Fluent? Я (как и многие другие) считаю, что это отличная инициатива, но я не забываю использовать ее, если она не находится в стабильном состоянии.

Q4) Во многих блогах упоминается, что они неуклонно работают над достижением паритета функций Fluent и hbn.xml. Есть ли где-нибудь список этих недостающих функций, чтобы помочь с оценкой и использованием этого инструмента?

Заранее оцените помощь.


person Community    schedule 07.08.2009    source источник


Ответы (3)


Я задал Джеймсу Грегори те же вопросы в электронном письме напрямую ему. Он дал отличный ответ.

'Привет, Пол,

1) KeyColumnNames - это то, что вам нужно.

2) Вы можете сделать это одним из трех способов. Настройте IHasManyConvention для глобального каскадирования всех отношений, используйте вызов ForTypesThatDeriveFrom или переопределение автоматического сопоставления.

3) Сейчас мы проводим частное тестирование нашей версии 1.0. Не уверен, будет ли у нас публичная бета-версия или прямая версия, но это должно произойти в ближайшие несколько недель.

4) Очень маловероятно, что мы когда-либо будем полностью укомплектованы функциями NHibernate, мы не хотим этого делать. Многие из возможностей NH чрезвычайно эзотеричны, и от их реализации мало пользы. Начиная с версии 1.0 будет очень мало функций, которые мы не поддерживаем и которые люди используют регулярно. Я могу с уверенностью сказать, что все распространенные сценарии сопоставления обслуживаются, и если есть что-то, что не так, вы всегда можете вернуться к hbm в этом случае.

Чтобы предотвратить любые комментарии о том, что наша документация устарела, документация будет переработана для версии 1.0;)

Джеймс'

Спасибо, Джеймс.

person Community    schedule 09.08.2009

Есть ли целевая дата выпуска проекта Fluent? Я (как и многие другие) считаю, что это отличная инициатива, но я не забываю использовать ее, если она не находится в стабильном состоянии.

Теперь вы сможете получить рабочую версию Fluent nHibernate из их репозитория SVN. У них также есть скомпилированные двоичные файлы.

В настоящее время нет официальных выпусков Fluent NHibernate. Это не отражение качества, а нашей быстрой скорости изменений. Наша кодовая база обновляется ежедневно, что делает выпуск официальных релизов бессмысленным делом, пока мы не достигнем паритета функций с NHibernate Core. Большинство обычных функций, которые вы используете изо дня в день, уже готовы.

http://fluentnhibernate.org/downloads

Текущие проблемы здесь:

http://code.google.com/p/fluent-nhibernate/issues/list

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

person Robert Harvey    schedule 07.08.2009

объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом. Тип: FluentNHibernateTesting.Entities.Employee, Entity: FluentNHibernateTesting.Entities.Employee

Если вы Google объект ссылается на несохраненный временный экземпляр, вы найдете несколько совпадений для этого. Лучше всего начать их изучать и устранять неполадки. Как ни странно, из того, что я прочитал, это звучит так, будто сообщение об ошибке означает именно то, что в нем говорится, или существует много-много или каскадное отношение, которое не обновляется.

person Robert Harvey    schedule 07.08.2009