FluentNHibernate Component.ColumnPrefix не применяется - PullRequest
3 голосов
/ 09 июня 2011

Я недавно обновил FluentNHibernate с v1.1.0.685 до v1.2.0.712 (последний) для NHibernate 2.1 .

Моя проблема, похоже, связана с классами, которые используют отображение Component().ColumnPrefix().

Например,

 public class Address{ 
    public string Street {get; set;} 
    public string Zip {get; set;} 
 } 

 public class AddressMap : ComponentMap<Address>{
     Map( x => x.Street );
     Map( x => x.Zip );
 }

 public class PersonMap : ClassMap<Person> 
 { 
    public PersonMap(){ 

       Id( x => x.Id ); 

       Map( x=> x.Name ); 

       Component( x => x.Address ) 
          .ColumnPrefix("ADDRESS_"); 
    } 
 } 

Таблица персон

  Id       Name        ADDRESS_Street     ADDRESS_Zip
 ----------------------------------------------------
  1        Brian       123 Example St.    12345

Поведение в FNH v1.1.0.685

Префикс "ADDRESS _" равен , правильно применяется к свойствам компонента Address.

Поведение в FNH v1.2.0.712 (последняя версия)

Префикс "ADDRESS _" равен и больше не применяется к свойствам компонента Address. NHiberante создает столбцы " Street " и " Zip ", которые не названы в таблице выше.


Буду признателен, еслиУ кого-нибудь есть понимание.Я начинаю думать, что это может быть ошибкой.

Спасибо,
Брайан

Ответы [ 3 ]

1 голос
/ 18 июля 2011

@ Брайан,

Я столкнулся с точным препятствием несколько недель назад.Я использую Autoppings и обошел его, создав соглашение о свойствах компонентов:

Public Class ComponentPropertyConvention
    Implements IPropertyConvention, IPropertyConventionAcceptance

    Public Sub Accept(ByVal criteria As IAcceptanceCriteria(Of IPropertyInspector)) Implements IConventionAcceptance(Of IPropertyInspector).Accept
       criteria.Expect(Function(inspector) inspector.EntityType.Namespace.EndsWith("Components"))
    End Sub

    Public Sub Apply(ByVal instance As IPropertyInstance) Implements IConvention(Of IPropertyInspector, IPropertyInstance).Apply
        instance.Column(String.Format("{0}_{1}", New String() {instance.EntityType.Name.ToLower(), instance.Property.Name.Dbize()}))
    End Sub

End Class

Вероятно, существует множество способов реализовать критерии приемлемости, поэтому не следуйте моим, если это не подходит ...

Приветствия

1 голос
/ 22 июля 2011

После исследования модульных тестов в исходном коде; похоже, что в моем случае мои соглашения применялись по-разному между FNH v1.1 и FNH v1.2 .

Я думаю, это то, что произошло:

  1. Мой AddressMap : ComponentMap<Address> будет выполнен (здесь нет проблем).

  2. My PersonMap : ClassMap<Person> отобразит компонент, используя:

    Component( x => x.Address ).ColumnPrefix("ADDRESS_"); 
    

    с шага 1.

  3. Мой FNH MyPropertyConvention будет звонить:

    public class MyPropertyConvention : IPropertyConvention
    {
        public void Apply( IPropertyInstance instance )
        {
            instance.Column( instance.Name ); //this call is destructive
                                              //to ColumnPrefix() in FNH v1.2
        }
    }
    

Появляется:

  • в FNH v1.1 , шаг 3 не разрушителен для префикса столбца при вызове instance.Column().

  • in FNH v1.2 , шаг 3 является разрушительным для любого ранее установленного ColumnPrefix() и перезаписывает имя столбца whole ( включая префикс).

Итак, я очистил свои соглашения для FNH 1.2 , используя IPropertyConventionAcceptance, проявляя осторожность в отношении моих вызовов на instance.Column(instance.Name) [теперь вызовы разрушительны для префиксов столбцов].

Спасибо всем за помощь,
Brian

0 голосов
/ 09 июня 2011

Вам необходимо создать класс ComponentMap<Address>, чтобы применить ColumnPrefix.

См. Здесь: http://wiki.fluentnhibernate.org/Fluent_mapping#ComponentMap.3CT.3E

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