2013-03-08 2 views
0

나는 부모 Foo, 많은 Child Foo 's 및 많은 Snafu 's를 가질 수있는 Foo 클래스가 있습니다. NHibernate는 Foo와 Snafu 테이블 모두에서 Foo_id와 ParentFoo_id를 생성합니다. 중복 필드는 메모리 낭비 일뿐만 아니라 중복 참조 중 하나가 NULL이 될 때 문제가 발생합니다. 이것은 SQL Server 2012를 사용하고 있습니다.부모/자식 관계에서 유창한 NHibernate 홀수 매핑 문제

왜 이런 현상이 발생하고 하나의 Foo_id를 생성하려면 어떻게해야합니까?

푸 클래스와 매핑 :

어쩌면
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는 반대 여야하며 두 매핑에 대해 column을 지정해야합니다. . 나는 혼란스러운`hasMany의 (X => x.Snafus) .Inverse() KeyColumn ("FOO_ID") 비슷해야했다 그래서 올바른 매핑

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

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

를 다음과 같이한다' – Handprint

1

는 참조 매핑에 명시 적으로 열 이름을 지정하려고 :

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 FooMap : ClassMap<Foo> { 
    public FooMap() { 
    Id(x=>x.Id); 
    References(x=>x.ParentFoo, "ParentFoo_id"); 
    HasMany(x=>x.ChildFoos); 
    HasMany(x=>x.Snafus); 
    } 
}