我有一个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)
答案 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");