Как сопоставить составной идентификатор с составным типом пользователя с помощью Fluent NHibernate? - PullRequest
2 голосов
/ 01 апреля 2010

я работаю с устаревшей базой данных тупо с индексом, состоящим из столбца идентификатора символа и двух столбцов символа, которые составляют дату и время соответственно. Я создал ICompositeUserType для столбцов даты и времени для сопоставления с одним свойством .NET DateTime моей сущности, которое работает само по себе, когда не является частью идентификатора. Мне нужно каким-то образом использовать составной идентификатор с сопоставлением ключевых свойств, который включает в себя мой ICompositeUserType для сопоставления с двумя столбцами даты и времени символа. Очевидно, с моей версией Fluent NHibernate, CompositeIdentityPart не имеет метода CustomTypeIs(), поэтому я не могу просто сделать следующее в моем переопределении:

mapping.UseCompositeId()
    .WithKeyProperty(x => x.Id, CommonDatabaseFieldNames.Id)
    .WithKeyProperty(x => x.FileCreationDateTime)
    .CustomTypeIs<FileCreationDateTimeType>();

что-то подобное возможно даже с NHibernate, не говоря уже о Fluent? Я не смог ничего найти по этому поводу.

UPDATE:

после более внимательного прочтения документации NHibernate я обнаружил, что NHibernate поддерживает составные идентификаторы компонентов , но не похоже, что он поддерживает пользовательские типы (например, IUserType и ICompositeUserType) для составных идентификаторов. Кроме того, версия Fluent, которую я имею, не имеет поддержки NHibernate для поддержки составных идентификаторов компонентов (см. выпуск 387 и выпуск 346 ). я, вероятно, попытаюсь обновить все мое решение, посмотреть, работает ли оно, и опубликовать ответ на свой вопрос, если это произойдет ... если только кто-то не скажет мне без меня об этом ... 8о)

Ответы [ 2 ]

0 голосов
/ 07 апреля 2010

NHibernate не поддерживает использование IUserType или ICompositeUserTypes для составных идентификаторов.Однако он поддерживает составные идентификаторы компонентов, но Fluent NHibernate имеет ограниченную поддержку для этого.Из того, что я мог видеть в исходном коде, он не позволяет указывать имена столбцов для свойств компонента, как позволяет NHibernate.Мне пришлось отказаться сейчас и просто создать два string поля, которые два string поля даты в базе данных могли бы сопоставить по отдельности, а затем иметь свойство DateTime?, которое переводило два свойства string.Подсказки к HeavyWave за их комментарий: «Хотя, я думаю, вы должны просто сопоставить каждый столбец с собственным полем и предоставить дополнительное свойство, которое объединяет их».

mapping.CompositeId()
            .KeyProperty(x => x.Id, CommonDatabaseFieldNames.Id)
            .KeyProperty(x => x.FileCreationDateString, CommonDatabaseFieldNames.FileCreationDate)
            .KeyProperty(x => x.FileCreationTimeString, CommonDatabaseFieldNames.FileCreationTime);
0 голосов
/ 04 апреля 2010

Попробуйте добавить это

mapping.Map(x => x.FileCreationDateTime).Columns.Add("FileCreationDate", "FileCreationTime").CustomSqlType("YourType");

Хотя я не уверен, какой смысл имеет CustomSqlType при обращении к двум столбцам одновременно. Наверное, нет. Можете ли вы создать представление, которое проецирует их на столбцы с обычным DateTime?

...