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

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

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

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

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

Q1) Я пытался написать реализацию 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();

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

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

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

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

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

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

3 ответа

Решение

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

"Эй, Пол,

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

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

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

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

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

Джеймс'

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

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

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

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

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

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

http://fluentnhibernate.org/downloads

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

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

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

Другие вопросы по тегам