0

親Foo、多くの子Foo、および多くのSnafuを持つことができるFooクラスがあります。NHibernateは、FooテーブルとSnafuテーブルの両方でFoo_idとParentFoo_idを生成しています。重複フィールドはメモリを浪費するだけでなく、重複参照の1つがNULLになると問題が発生します。これはSQLServer2012を使用しています。

なぜこれが発生するのですか?これを取得して単一の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

たぶん、参照マッピングで列名を明示的に指定しようとしますか?私は推測していますが、これは私が同様の状況のた​​めに私のマッピングのいくつかを行った方法です。

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 に答える
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 に答える