2010-06-26 66 views
0

如果我有一个父类:当使用Fluent NHibernate自动映射集合时,您如何使父项的子外键可为空?

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

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

和一个子类,像这样:

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

每当我让流利NHibernate的automapper打这些家伙,它使Child类具有非可空的外键。我已经改变了一些自动映射约定和某些类的重写,但是对于这对特定的对,只有Parent类具有覆盖。覆盖不指定如何映射Parent类的集合部分。

是否使一个外键不能在一个集合的孩子的默认行为,或者我已经F'ed了东西?

如何在映射重写类中指定子外键是可以为空的?

和平!

+0

请张贴您的映射。和平。 – anthony 2010-06-26 17:46:12

+0

我离开我的周末代码,但是当我回来时我会发布它。谢谢! – 2010-06-26 17:48:59

回答

0

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

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

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

+0

混合流利的地图和自动映射确实很笨拙。 IAutomappingOverride接口几乎为您提供了流畅地图所具备的所有功能,并且它以与自动映射很好地相配的方式进行操作。由于您使用自动映射,我建议您尽可能使用IAutomappingOverride而不是ClassMaps。 – 2010-06-30 13:45:04

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(); 
     } 
    } 
+0

我会给它一个镜头,我只是假设你只是应该使用。参考一对一关系和HasMany一对多关系。但我猜这个假设是错误的。 – 2010-06-28 15:56:25

+0

第一个解决方案产生此错误: 表中的关联父指的是未映射的类:System.Collections.Generic.IList ,我想我必须让它映射集合。我将automapper限制为从基类继承的实体。尽管它最终还是工作,但它似乎还是有些尴尬。 – 2010-06-29 02:52:35

+0

引用()用于定义多对一的关系,这正是您上例中Child和SomeThirdClass之间的关系,所以它是合适的。如果你希望Child有一个引用返回给它的Parent,那么你也可以使用References()来实现它(如果你不是automapping的话)。不知道我按照你的评论关于尴尬。通常,你让自动映射器映射你的整个域,然后你指定自动映射覆盖你想要处理的位。你的情况有什么不同? – 2010-06-29 07:11:26

相关问题