Свободный NHibernate. Авто картография и условные обозначения - PullRequest
4 голосов
/ 07 августа 2009

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

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

Чтобы подвести итог моих шагов:

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

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

Я также внес некоторые незначительные изменения в слой Entities в этом примере, так как думал, что это облегчит задачу: они должны были переименовать StoresStockedIn в Stores (Product.cs) и Staff to 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, Объект: FluentNHibernateTesting.Entities.Employee

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

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

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

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

Ответы [ 3 ]

1 голос
/ 10 августа 2009

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

'Эй, Пол,

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

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

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

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

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

Джеймс

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

0 голосов
/ 07 августа 2009

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

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

0 голосов
/ 07 августа 2009

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

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

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

http://fluentnhibernate.org/downloads

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

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

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

...