public class Parent
{
public virtual int Id { get; set; }
private IList<Child> _testCollection;
public virtual IList<Child> TestCollection
{
get
{
return _testCollection;
}
}
}
public class Child
{
public virtual int Id { get; set; }
}
public class CollectionAccessConvention : ICollectionConvention
{
public void Apply( ICollectionInstance instance )
{
instance.Access.CamelCaseField( CamelCasePrefix.Underscore );
}
}
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Test.Parent, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Parent`">
<id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="Id" />
<generator class="identity" />
</id>
<bag access="nosetter.camelcase" name="TestCollection" mutable="true">
<key>
<column name="Parent_id" />
</key>
<one-to-many class="Test.Child, Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
编辑:@Bary:奇怪的是access =“nosetter.camelcase”。我认为它应该是access =“field.camelcase-underscore”。有什么建议吗?
答案 0 :(得分:-3)
我明白了。
约定工作有点奇怪,但随着时间的推移,我想我会完全意识到这一点。当您想要应用关于某些属性或任何属性的约定时,仅当它尚未配置/设置/定义时才会应用它。因此,当fluent编译映射时,它会自动将readonly属性设置为access =“nosetter.camelcase”。幸运的是,有一种方法可以解决这个问题。
解决方案:
您必须通过扩展 DefaultAutomappingConfiguration 类来定义自己的自动配置,然后覆盖方法 公共虚拟访问GetAccessStrategyForReadOnlyProperty(成员) 或者只是实现 IAutomappingConfiguration 界面。完成后,可以在初始化流畅配置时添加此配置。
Fluently.Configure( Configuration )
.Mappings( cfg =>
{
cfg.AutoMappings.Add( *yourIAutomappingConfiguration* )
}