使用Fluent NHibernate自动映射集合时,如何将子项的外键设为父可空?

时间:2010-06-26 17:38:49

标签: c# nhibernate orm fluent-nhibernate automapping

如果我有父类:

public class Parent
{
    public Parent()
    {
        Children = new List<Child>();
    }

    IList<Child> Children {get; private set;}
}

和这样的子类:

public class Child
{
     public SomeThirdClass Friend {get; set;}
}

每当我让Fluent NHibernate的自动播放器击中这些人时,它会使Child类具有不可为空的外键。我已经更改了一些自动化约定和某些类的一些覆盖,但是对于这个特定的对,只有Parent类具有覆盖。覆盖不指定如何映射Parent类的集合部分。

是否在集合的子节点中使外键不可为空而无法使用默认行为,或者我有什么东西可以使用?

如何在映射覆盖类中指定子外键可以为空?

乎!

2 个答案:

答案 0 :(得分:3)

你试过这个:

   public class ChildMap : IAutoMappingOverride<Child>
   {
       public void Override(AutoMapping<Child> mapping)
       {
           mapping.References(x => x.OtherThing)
               .Nullable();
       }
   }

如果要将其设为所有外键的默认值,可以使用:

   public class NullableFKConvention : IReferenceConvention
   {
       public void Apply(IManyToOneInstance instance)
       {
           instance.Nullable();
       }
   }

答案 1 :(得分:0)

我能够通过删除第四个GrandParent类的流畅映射来解决问题,并允许automapper映射该类。在我不允许自动播放器映射GrandParent类之前,因为我有一个流畅的该类映射。不知何故,流畅和自动映射之间的冲突导致Child中的外键不可为空。

我不能说我完全理解出了什么问题,所以在遵循我的解决方案时要小心。但我可以说,将Fluent Mappings和Automappings结合起来肯定会增加调试持久性问题的复杂性。

替代解决方案:我再次遇到此问题两次,我注意到如果我在父KeyColumn(string columnName)中调用IAutoMappingOverride,子类中的外键将默认为Nullable而不是非空。疯了吧?