2009-01-22 45 views
5

我遇到麻煩的東西,(我認爲)應該是簡單的,但無法找到任何明確的信息。使用nHibernate 2.0的Session.Get <T>麻煩在一個類與複合ID

在那裏我有三個表的情況下,描述一個領域,當一個人可以有一個以上的作業:

人 - 有PERSONID,名稱
工作 - 具有的JobId,作業名
PersonJob - 有PERSONID ,JobId,YearsOfEmployment

注意:在我的對象模型中,我有表示每個表的實體。我有第三個實體來表示Person/Job關係,因爲那裏有有用的元數據(YearsOfEmployment),並不僅僅是一個簡單的連接表。因此,如果我知道PersonId和JobId,是否有簡單的方法讓我使用會話並返回匹配這些Id的對象?因爲我已經知道主鍵有一個大腦死亡,簡單的方法,我可以將SQL「SELECT YearsOfEmployment FROM PersonJob Where PersonId = 1 AND JobId = 1」轉換成如下所示的內容:

var keys = new {PersonId=1, JobId=2};
PersonJob obj = Session.Get<PersonJob>(keys);

BTW:地圖會是這個樣子:

<class name="Person" table="dbo.Person" lazy="true"> 
    <id name="PersonId"> 
    <generator class="native"/> 
    </id> 
    <property name="Name"/> 
</class> 
<class name="Job" table="dbo.Job" lazy="true"> 
    <id name="JobId"> 
    <generator class="native"/> 
    </id> 
    <property name="JobName"/> 
</class> 
<class name="PersonJob" table="dbo.PersonJob" lazy="true"> 
    <composite-id> 
    <key-property name="PersonId"></key-property> 
    <key-property name="JobId"></key-property> 
    </composite-id> 
    <property name="YearsOfEmployment"/> 
</class> 

回答

8

好吧,我回答我自己的問題。我認爲發佈你的問題幾乎和與某人談話一樣具有說服力。如果我做PersonJob的複合ID的組件或類,即

<class name="PersonJob" table="dbo.PersonJob" lazy="true"> 
    <composite-id name="PersonJobKey" class="PersonJobKey"> 
     <key-property name="PersonId"></key-property> 
     <key-property name="JobId"></key-property> 
    </composite-id> 
</class> 

然後,我可以簡單地這樣做:

PersonJobKey key = new PersonJobKey() { PersonId = 1, JobId = 1 }; 
PersonJob obj = Session.Get<PersonJob>(key); 
int yearsOfEmployment = obj.YearsOfEmployment; 

涼爽。希望這可以幫助其他人找出這個...

+0

可能是值得加入整個PersonJobKey類作爲目前我正在試圖找出我需要重寫什麼課。 – 2010-04-20 17:06:29

3

感謝您發佈上述答案,我正在查看它對照我已映射的組合鍵沒有名稱或類的對象。當我嘗試讓一個類來表示組合鍵時,它改變了對象在被其他代碼使用時的行爲方式。我也想寫一些類似的東西;

Session.Get<SalesRepArea>(new { AreaCode = "ACode", RegionCode = "RCode"}); 

我發現NHibernate的不能讓匿名對象的多大意義,但我意識到,我不爲我的複合鍵,或類類型需要一個名字。事實上,nHibernate Get方法實際上是一個臨時對象,因此它可以從數據庫中獲得它的等價對象(必須爲什麼你必須重寫C#類中的equals方法才能使組合鍵工作)。所以以下地圖

<class name="SalesRepArea"> 
    <composite-id> 
     <key-property 
     name="AreaCode" column="AreaCode" type="String" length="12" /> 
     <key-property 
     name="RegionCode" column="RegionCode" type="String" length="12" /> 
    </composite-id> 

我寫的有點更少的代碼,並與代表鍵的對象分配得到

SalesRepArea myArea = Session.Get<SalesRepArea>(
    new SalesRepArea() 
    { 
     AreaCode = "ACode", 
     RegionCode = "RCode" 
    } 
); 

我不是說指定的關鍵方法是不好的,少的代碼並不總是更好,它只是表明Hibernate正在尋找關鍵所在的對象來從數據庫中獲取特定的對象。

如果我錯了,請讓我知道,但我希望這可以幫助,因爲我在這方面遇到了一些麻煩。

感謝,

馬克