如果我有父类:
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
类的集合部分。
是否在集合的子节点中使外键不可为空而无法使用默认行为,或者我有什么东西可以使用?
如何在映射覆盖类中指定子外键可以为空?
乎!
答案 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而不是非空。疯了吧?