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

时间:2013-03-08 15:23:31

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有一个Foo类,可以有一个父Foo,很多Child 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

Snafu类和映射:

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)

2 个答案:

答案 0 :(得分:1)

也许尝试在References映射中明确指定列名?我猜,但这就是我在类似情况下做的一些映射。

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);
  }
}

答案 1 :(得分:1)

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

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

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