Как правило, использование AutoMapping
является плохой политикой, поскольку поле Id
должно существовать в таблицах вашей базы данных. Вместо этого рассмотрите возможность использования генератора отображений, например NMG , для обработки сопоставления.
В этом случае вы сначала захотите загрузить / установить приложение, а затем сгенерировать файлы сопоставления из своей базы данных (Oracle, SQL и другие).
Чтобы создать файлы сопоставления, сначала создайте папку /Entities/
в своем проекте. Затем настройте программное обеспечение генератора следующим образом:
Preferences
- Имя сгенерированного свойства = совпадает с именем столбца базы данных (без изменений)
- Стиль отображения = Свободное отображение
- Поле или свойство = Авто свойство
Доступные языки: C # и VB
- Папка:
[your project folder]\Entities
- Пространство имен:
[your project namespace].Entities
- Название сборки:
[your project name].Entities
Далее, либо «Создать все», либо «Создать конкретную таблицу».
Все файлы *.cs
и *Map.cs
теперь должны быть созданы в вашем проекте (вы можете добавить их с помощью Add Existing Item...
, если они не отображаются).
Используя Fluent, вы увидите что-то вроде следующего:
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Sequence("keyname_ID")
или
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Identity()
.Column("keyname_ID")
или
Id(x => x.keyName_ID)
.Column(x => x.keyname_ID)
.GeneratedBy
.Assigned()
Итак, теперь нам нужно указать Id
, используя FluentMapping
с Fluent nHibernate
. Для этого вам нужно переписать строку Id
кода в каждом из файлов Map
в решении. Просто добавьте:
Id(x => x.KeyName_ID)
.GeneratedBy
.GetGeneratorMapping()
.IsSpecified("KeyName_ID");
Где keyname_id
- это имя столбца id
в вашей базе данных, а не созданный.
Обратите внимание, что в вашем отображении на BuildSession
вы должны иметь:
(...).Mappings(m =>
m.FluentMappings.AddFromAssemblyOf<[one of your entities]>()
);
И теперь Id
сопоставлено. :) Надеюсь, это поможет!