自动化收集约定

时间:2010-07-13 19:01:05

标签: fluent-nhibernate

好吧,我很难使用流畅的nhibernate自动化集合。这次我尝试应用一个集合约定,简单地说使用带有下划线的camelCaseField。好吧,我加载了约定,我在下面的方法中点击了断点,FNH仍然会产生奇怪的映射。我做错了什么?

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”。有什么建议吗?

1 个答案:

答案 0 :(得分:-3)

我明白了。

约定工作有点奇怪,但随着时间的推移,我想我会完全意识到这一点。当您想要应用关于某些属性或任何属性的约定时,仅当它尚未配置/设置/定义时才会应用它。因此,当fluent编译映射时,它会自动将readonly属性设置为access =“nosetter.camelcase”。幸运的是,有一种方法可以解决这个问题。

解决方案:

您必须通过扩展 DefaultAutomappingConfiguration 类来定义自己的自动配置,然后覆盖方法 公共虚拟访问GetAccessStrategyForReadOnlyProperty(成员) 或者只是实现 IAutomappingConfiguration 界面。完成后,可以在初始化流畅配置时添加此配置。

Fluently.Configure( Configuration )
                .Mappings( cfg =>
                {
                    cfg.AutoMappings.Add( *yourIAutomappingConfiguration* )
                }