【问题标题】:Automapping collection convention自动映射集合约定
【发布时间】:2010-07-13 19:01:05
【问题描述】:

好的,我很难使用流利的 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"。有什么建议吗?

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    我想通了。

    惯例有点奇怪,但随着时间的推移,我想我会完全意识到这一点。当您想应用有关某些属性或任何内容的约定时,只有在尚未配置/设置/定义时才会应用它。因此,当 fluent 编译映射时,它会自动将只读属性设置为 access="nosetter.camelcase"。幸运的是,有办法解决这个问题。

    解决办法:

    您必须通过扩展 DefaultAutomappingConfiguration 类定义自己的自动映射配置,然后重写方法 public virtual Access GetAccessStrategyForReadOnlyProperty(Member member) em> 或者只实现 IAutomappingConfiguration 接口。完成后,您可以在初始化 fluent 配置时添加此配置。

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

    【讨论】:

    • 干得好。我想集合约定访问策略的代码毕竟还不错!
    • 是的,这很好,但这不是上一个问题的答案,因为为 ISet 集合生成的映射是 而不是 。我仍然无法处理它。
    • 不,不,不。再看看大会。好的,这里有一个提示;它在 ICollection 上运行。然后再次查看您的代码。如果你还是不明白,我会告诉你如何正确地生成一个集合。 HTH
    • 好吧,我尝试了很多东西,但我想我错过了一些基本的东西。如果你能帮助我,请把它贴在另一个线程中。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2011-02-10
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多