Свободный 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
Ни один из них не кажется убийцами сделок. Я думаю, это зависит от того, сколько времени у вас есть на эксперименты.