Свободный NHibernate - Настройка CutomType IIdConvention - PullRequest
2 голосов
/ 14 ноября 2010

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

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

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

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

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

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

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

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

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();

Спасибо.

Ответы [ 3 ]

0 голосов
/ 06 октября 2011

У меня точно такая же проблема, было бы замечательно, если бы 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 голосов
/ 21 декабря 2011

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

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

Была поднята ошибкао AddFromAssemblyOf еще в феврале 2011 года: Свободный NHibernate - Настройка CutomType IIdConvention .Решение не опубликовано.

Обходным решением является явное добавление каждой из конвенций

Conventions.Add<PrimaryKeyHasTableName>()

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

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

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

0 голосов
/ 17 ноября 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...