如何使用Fluent Nhibernate自动化约定将一个实体映射到多个DB表

时间:2011-03-10 12:05:13

标签: nhibernate fluent automapping convention

我在域模型中有一个实体CustomProperty,它可以从其他几个实体中使用。

Product
{
    int Id;
    Collection<CustomProperty> CustomProperties;
}

Order
{
    int Id;
    Collection<CustomProperty> CustomProperties;
}

但是在DB中,我不希望只有一个表CustomProperty包含Product表的可空外键和Order的另一个可空外键。相反,我需要两个单独的表ProductCustomPropertyOrderCustomProperty

我需要使用自动化和约定来做到这一点。有没有人有任何想法?

是的,我有一个对我不起作用的想法。也许任何人都有线索原因:

   public class CustomPropertyConvention : IHasManyConvention, IHasManyConventionAcceptance
   {
         public void Apply(IOneToManyCollectionInstance instance)
         {
                instance.Table("ProductCustomProperty");
         }

         public void Accept(IAcceptanceCriteria<IOneToManyCollectionInspector> criteria)
         {
                criteria.Expect(i => i.Relationship.Class.Name == "CustomProperty" && i.Relationship.EntityType == typeof(Product));
         }
   }

此示例必须完美运行,但IOneToManyCollectionInstance.Table()不会设置任何内容。

1 个答案:

答案 0 :(得分:0)

one-to-many关系会忽略该表,因为FK列位于多方实体中。

换句话说,你不能将一个CustomProperty实体映射到两个不同的表(它没有意义)。

您可以使用many-to-many映射,也可以将CustomProperty映射为复合类型而不是实体。