2010-11-14 7 views
2

У меня есть следующая версия IIdConvention для автомагнитола FluentNHibernate. Я хочу, чтобы все мои свойства id использовали пользовательский тип, который представлен строковым свойством, но CustomType никогда не применяется к моим сопоставлениям.Fluent NHibernate - настройка CutomType IIdConvention

public class PrimaryKeyHasTableName : FluentNHibernate.Conventions.IIdConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance) 
    {   
     instance.Column(instance.EntityType.Name + "Id"); 
     instance.CustomType<CustomIdType>(); 
    } 
} 

Когда я посмотрел на источник FluentNHibernate представляется, что тип для свойства идентификатора уже установлен поэтому он не установлен на моей конвенции.

Если я использую ClassMap для сопоставления класса вручную, у меня нет проблем с настройкой CustomType для свойства Identity.

Id(x => x.Id) 
     .Column("UserId")     
     .CustomType<OnFileIdType>(); 

Кто-нибудь знает, как я могу успешно установить пользовательское свойство id, используя соглашение?

Или получите мое соглашение для запуска ранее в процессе сопоставления, чтобы тип еще не был установлен к моменту моего кода.

Кроме того, вот мой код конфигурации:

Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2005.ConnectionString(connString)) 
      .Mappings(m => 
      { 
       m.FluentMappings.AddFromAssemblyOf<BaseEntity>(); 
       m.AutoMappings.Add(AutoMap.AssemblyOf<BaseEntity>() 
            .Where(t => t.Namespace.EndsWith("Models.Domain")) 
            .Conventions.AddFromAssemblyOf<BaseEntity>() 
            .UseOverridesFromAssemblyOf<BaseEntity>() 
       ); 
      }) 
      .ExposeConfiguration(CreateSchema) 
      .BuildSessionFactory(); 

Спасибо.

ответ

0

Я не думаю, что вы можете достичь того, чего хотите с помощью условностей.

Одна вещь, которую вы можете попробовать, состоит в том, чтобы все подсайты ваших сущностей были от абстрактного объекта, который определяет свойство Id, и имеет для него настраиваемое сопоставление типов. Я бы не рекомендовал этого, но он просто откроет место для большего числа проблем с автопилотом.

Просто перейдите к руководству CustomType для каждой карты классов.

+0

я получил эту работу, используя FluentMappings и базовый объект, но не может получить AutoMappings, чтобы принять CustomType даже при создании переопределения для каждого отдельного класса. –

+0

Смешивание FluentMapping с Automapping иногда может привести к проблемам. Когда Automapper должен ссылаться на специальные типы или имена столбцов из явно отображаемых объектов. Почему вы не позволили автопарку отобразить ваш базовый объект? вы пытались использовать IgnoreBase? – Variant

0

У меня такая же проблема, было бы здорово, если бы это поддержало IIdConvention от FNH.

После прочтения нескольких вещей и чтения я смирился с реализацией IAutoMappingOverride для сущностей с использованием пользовательского типа для своего Идентификатора.

public class ProductMap : IAutoMappingOverride<Product> 
{ 
    public void Override(AutoMapping<Product> mapping) 
    { 
     mapping.Id(x => x.Id).CustomType<ProductId>(); 
    } 
} 

Использование автоматического переопределения вместо ClassMap будет продолжать автоматизировать остальные ваши свойства. Измените свой код инициализации AutoMappings для включения

.Overrides.AddFromAssemblyOf<BaseEntity>() 
0

У меня такая же проблема. Я считаю, что это связано с вызовом Conventions.AddFromAssemblyOf<BaseEntity>(), в результате чего пользовательское соглашение не применяется.

(Кстати, посланной код будет работать только тогда, когда ваши классы конвенции в той же сборке, что и ваш BaseEntity - это может быть безопаснее использовать Conventions.AddFromAssemblyOf<PrimaryKeyHasTableName>())

Исправлена ​​ошибка была поднята о AddFromAssemblyOf в феврале 2011 года : Fluent NHibernate - Setting CutomType IIdConvention. Сообщение не опубликовано.

Работа вокруг, кажется, добавить каждой из конвенций явно

Conventions.Add<PrimaryKeyHasTableName>() 

Чтобы проверить это, вы можете добавить следующую строку после строки, которая добавляет automappings, чтобы экспортировать отображения в hbm.xml на вашем жестком диске и взглянуть на сгенерированные сопоставления.

m.AutoMappings.ExportTo(@"C:\ExportedMappings") 

Кроме того, я предлагаю вам добавить точку останова в методе Применить и запустить код, чтобы убедиться, что в настоящее время вызывается.)

Смежные вопросы