如何使用Fluent NHibernate AutoMap约定映射相同类型的两个组件

时间:2012-03-28 21:26:52

标签: fluent-nhibernate

我们正在使用Fluent NH和基于约定的映射。我有以下内容:

public class Foo() : Entity
{
  public BarComponent PrimaryBar { get; set; }
  public BarComponent SecondaryBar { get; set; }
}

public class BarComponent
{
  public string Name { get; set; }
}

我知道它将使用单个名称字段创建foo表。我尝试了以下Override,它不起作用。

  public class FooOverride : IAutoMappingOverride<Foo>
    {
        public void Override(AutoMapping<Foo> mapping)
        {
            mapping.Component(x => x.PrimaryBar).ColumnPrefix("primary");
            mapping.Component(x => x.SecondaryBar).ColumnPrefix("secondary");
        }
    }

我是否真的需要进行完全覆盖映射,或者我可以在这里以某种方式工作?

2 个答案:

答案 0 :(得分:0)

几年前,当我开始使用FNH时,我遇到了这个问题。这是我见过的FNH Automapping不会“正常工作”的少数情景之一。

当时向我建议的方法,我已成功使用(但实体,而不是组件)是创建空的中间实体,并在后代类中引用它们。

在您的情况下,您可以创建两个从BarComponent继承的新的空类(例如,PrimaryBarComponent和SecondaryBarComponent)。

然后,在你的Foo类中,将它们声明为:

public PrimaryBarComponent PrimaryBar { get; set; }
public SecondaryBarComponent SecondaryBar { get; set; }

在我看来,这是一个kluge,但它适用于实体和实体列表,并且不需要任何覆盖或约定。

我从未使用过FNH的组件,所以我不知道类似的方法是否有效,但可能值得研究。

答案 1 :(得分:0)

我最终得到了我在问题中描述的方式。事实证明,我们的AutoMappingConfiguration存在问题,它继承自DefaultAutomappingConfiguration。我们没有正确识别组件。