我最近将 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
“ADDRESS _”前缀正确应用于地址组件的属性。
“ADDRESS _”前缀不再应用于Address组件的属性。 NHiberante 会生成“街道”和“ Zip ”列,这些列未在上表中列出。
如果有人有任何见解,我会很感激。我开始认为可能是一个错误。
谢谢,
布赖恩
答案 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 之间的应用方式不同。
我认为这就是发生的事情:
我的AddressMap : ComponentMap<Address>
会被执行(这里没问题)。
我的PersonMap : ClassMap<Person>
会使用以下内容映射组件:
Component( x => x.Address ).ColumnPrefix("ADDRESS_");
来自第1步。
我的 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
}
}
看来:
,在调用instance.Column()
时,步骤3 非破坏到列前缀。
,步骤3 破坏性到先前设置的任何ColumnPrefix()
并覆盖整个列名(包括前缀)。
所以,我使用IPropertyConventionAcceptance
清除了 FNH 1.2 的惯例,小心我对instance.Column(instance.Name)
的调用[现在调用对列前缀有破坏性]。
感谢大家的帮助,
布赖恩
答案 2 :(得分:0)
您需要创建ComponentMap<Address>
课程才能应用ColumnPrefix
。
见这里:http://wiki.fluentnhibernate.org/Fluent_mapping#ComponentMap.3CT.3E