FluentNHibernate Component.ColumnPrefix未应用

时间:2011-06-09 03:08:01

标签: c# .net nhibernate fluent-nhibernate

我最近将 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 _”前缀正确应用于地址组件的属性。

FNH v1.2.0.712中的行为(最新)

“ADDRESS _”前缀不再应用于Address组件的属性。 NHiberante 会生成“街道”和“ Zip ”列,这些列未在上表中列出。


如果有人有任何见解,我会很感激。我开始认为可能是一个错误。

谢谢,
布赖恩

3 个答案:

答案 0 :(得分:1)

@布赖恩,

几周前我遇到了确切的障碍。我正在使用自动化并通过创建组件属性约定来解决它:

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 :(得分:1)

在调查源代码中的单元测试之后;看来,就我而言,我的约定在 FNH v1.1 FNH v1.2 之间的应用方式不同。

我认为这就是发生的事情:

  1. 我的AddressMap : ComponentMap<Address>会被执行(这里没问题)。

  2. 我的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
        }
    }
    
  4. 看来:

      FNH v1.1
    • ,在调用instance.Column()时,步骤3 非破坏到列前缀。

    • FNH v1.2
    • ,步骤3 破坏性到先前设置的任何ColumnPrefix()并覆盖整个列名(包括前缀)。

    所以,我使用IPropertyConventionAcceptance清除了 FNH 1.2 的惯例,小心我对instance.Column(instance.Name)的调用[现在调用对列前缀有破坏性]。

    感谢大家的帮助,
    布赖恩

答案 2 :(得分:0)

您需要创建ComponentMap<Address>课程才能应用ColumnPrefix

见这里:http://wiki.fluentnhibernate.org/Fluent_mapping#ComponentMap.3CT.3E