0

我有一个 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

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)
4

2 回答 2

1

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

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

HasMany(x => x.ChildFoos)
    .Inverse() // Important!
    .KeyColumn("PARENT_FOO_ID");
于 2013-03-11T02:29:20.977 回答
1

也许尝试在引用映射中明确指定列名?我猜,但这就是我为类似情况完成一些映射的方式。

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);
  }
}
于 2013-03-08T16:43:12.273 回答