2014-02-12 32 views
1

我在構建關係時遇到了一些麻煩。關於多表返回信息限制的知識

  • 一個Foo有很多Bar S,A Bar可以有很多Foo小號
  • 一個Foo有很多Zaz S,A Zaz可以有很多Foo小號
  • 一個Bar可以有很多Zaz S和Zaz可以有一個Bar
    • A Bar只能有一個ZazFoo

因此,舉例來說,我應該能夠以下(假設只有一個元素在每種類型爲簡單起見)做:

// get a single Foo 
Foo foo = this.Session.Get<Foo>(1); 
// get a single Bar 
Bar bar = this.Session.Get<Bar>(1); 
// no restriction on Foo so get a collection 
IEnumerable<Zaz> allZazsInFoo = foo.Zazs; 
// no restriction on Bar so get a collection 
IEnumerable<ZaZ> allZazsInBar = bar.Zazs; 
// restriction on Foo by Bar so only one Zaz 
Zaz zazOfABarInFoo = foo.Bars.Single().Zaz; 
// restriction on Bar by Foo so only one Zaz 
Zaz zazOfAFooInBar = bar.Foos.Single().Zaz; 

這是否有道理?這種形式的關係(或類似的)可能在NHibernate中?

+0

我很喜歡,因爲複雜的問題,但是這是集中在以這樣的方式創建模式是數據庫強制它或_simply_ NHiberate處理它? –

+0

@ M.Mimpen我不認爲數據庫需要在這裏執行任何特殊的操作。我__think__(糾正我,如果我錯了)它應該只是'Foo:Bar'上的'M:M','Foo:Zaz'上的'M:M'和'Bar上的'1:M' :Zaz'。所以更多的是讓NHibernate能夠很好地播放,所以它在代碼中很有意義。 –

回答

0

好吧,我最終所做的事情實際上很愚蠢。

Foo類我說:

public virtual Zaz GetZaz(int barId) 
{ 
    return this.Zazs.SingleOrDefault(x => x.Bar.Id == barId); 
} 

然後調用,像這樣:

Bar aBarInFoo = foo.Bars.Single(); 
Zaz zazOfABarInFoo = foo.GetZaz(aBarInFoo.Id);