父/子关系中的Fluent NHibernate奇数映射问题

父/子关系中的Fluent NHibernate奇数映射问题,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有一个Foo类,它可以有一个父Foo、许多子Foo和许多Snafu。NHibernate正在Foo和Snafu表中生成Foo_id和ParentFoo_id。重复字段不仅浪费内存,而且在其中一个重复引用最终为NULL时也会导致问题。这是使用SQL Server 2012 为什么会发生这种情况?我如何才能让它生成一个Foo_id Foo类和映射: public class Foo { public int Id { get; set; } public Foo ParentFoo { g

我有一个Foo类,它可以有一个父Foo、许多子Foo和许多Snafu。NHibernate正在Foo和Snafu表中生成Foo_id和ParentFoo_id。重复字段不仅浪费内存,而且在其中一个重复引用最终为NULL时也会导致问题。这是使用SQL Server 2012

为什么会发生这种情况?我如何才能让它生成一个Foo_id

Foo类和映射:

public class Foo {
  public int Id { get; set; }
  public Foo ParentFoo { get; set; }
  public IList<Foo> ChildFoos { get; set; }
  public IList<Snafu> Snafus { get; set; }
}
public class FooMap : ClassMap<Foo> {
  public FooMap() {
    Id(x=>x.Id);
    References(x=>x.ParentFoo);
    HasMany(x=>x.ChildFoos);
    HasMany(x=>x.Snafus);
  }
}

----Resulting Foo Table----
Id (PK, int, not null)
Foo_id (FK, int, null)        <- refers to ParentFoo
ParentFoo_id (FK, int, null)  <- also refers to ParentFoo
public class Snafu {
  public int Id { get; set; }
  public Foo Foo { get; set; }
  public string Value { get; set; }
}
public class SnafuMap : ClassMap<Snafu> {
  public SnafuMap() {
    Id(x=>x.Id);
    References(x=>x.Foo);
    Map(x=>x.Value);
  }
}

----Resulting Snafu Table----
Id (PK, int, not null)
Foo_id (FK, int, null)        <- refers to Foo
ParentFoo_id (FK, int, null)  <- refers to same Foo
Value (nvarchar(255), null)
公共类Foo{
公共int Id{get;set;}
public Foo ParentFoo{get;set;}
公共IList ChildFoos{get;set;}
公共IList混乱{get;set;}
}
公共类FooMap:ClassMap{
公共地图(){
Id(x=>x.Id);
参考文献(x=>x.ParentFoo);
HasMany(x=>x.ChildFoos);
有许多(x=>x.Snafus);
}
}
----结果Foo表----
Id(主键,整数,非空)
Foo_id(FK,int,null)x.Foo);
Map(x=>x.Value);
}
}
----结果Snafu表----
Id(主键,整数,非空)

Foo_id(FK,int,null)是否可以尝试在引用映射中显式指定列名?我猜,但这就是我为类似情况所做的一些映射

public class FooMap : ClassMap<Foo> {
  public FooMap() {
    Id(x=>x.Id);
    References(x=>x.ParentFoo, "ParentFoo_id");
    HasMany(x=>x.ChildFoos);
    HasMany(x=>x.Snafus);
  }
}
公共类FooMap:ClassMap{
公共地图(){
Id(x=>x.Id);
参考文献(x=>x.ParentFoo,“ParentFoo_id”);
HasMany(x=>x.ChildFoos);
有许多(x=>x.Snafus);
}
}

父foo应该是反向的,并且需要为这两个映射指定列。 所以正确的映射应该如下所示

References(x => x.ParentFoo)
    .Column("PARENT_FOO_ID");

HasMany(x => x.ChildFoos)
    .Inverse() // Important!
    .KeyColumn("PARENT_FOO_ID");

我必须对Snafus
HasMany(x=>x.Snafus)执行类似的操作