0

如果我有一个父类:

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类的集合部分。

使集合的子项中的外键不可为空是默认行为,还是我做了什么?

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

和平!

4

2 回答 2

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();
       }
   }
于 2010-06-28T10:46:22.730 回答
0

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

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

替代解决方案:我又遇到了两次这个问题,我注意到如果我为 Parent 调用KeyColumn(string columnName)IAutoMappingOverride子类中的外键将默认为 Nullable,而不是 Not-Null。疯了吧?

于 2010-06-29T20:56:11.207 回答