2013-03-08 58 views
0

我有一个Foo类,可以有一个Parent Foo,许多Child Foo和许多Snafu。 NHibernate在Foo和Snafu表中都会生成一个Foo_id和一个ParentFoo_id。重复字段不仅浪费内存,而且当其中一个重复引用结束NULL时也会导致问题。这是使用SQL Server 2012.父母/子女关系中流利的NHibernate奇数映射问题

为什么发生这种情况,我怎么能得到这个来产生一个单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) 

回答

1

父foo应该相反,并且您需要为两个映射指定列。 所以正确的映射应类似于以下

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

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

我不得不做的混战'的hasMany(X => x.Snafus).Inverse()KeyColumn( “FOO_ID”)类似;' – Handprint 2013-03-12 14:51:40

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