2010-07-06 65 views
1

我有一個沒有ParentId屬性但在數據庫中具有所需外鍵的孩子。我試圖讓使用ParentId的孩子使用NHibernate,但它拋出一個錯誤,說無法解析屬性ParentId。使用NHibernate從父母身份獲取孩子

public class Parent 
{ 
    public int ParentId{ get; set; } 

    public string Name{ get; set; } 
} 

public class Child 
{ 
    public int ChildId{ get; set; } 

    public string Name{ get; set; } 
} 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="SomeAssembly" 
        namespace="SomeAssembly.SomeNamespace"> 
    <class name="Parent" lazy="false" table="Parents"> 
     <id name="ParentId"> 
      <generator class="native" /> 
     </id> 
     <property name="Name" /> 
    </class> 

    <class name="Child" lazy="false" table="Children"> 
     <id name="ChildId"> 
      <generator class="native" /> 
     </id> 
     <property name="Name" /> 
    </class> 
</hibernate-mapping> 
+0

更多信息會更好。就像casses的樣子和映射文件一樣。 – chrissie1 2010-07-06 10:19:03

+0

當然,你必須映射屬性(通過noop,因爲你下面說,你不能改變原來的類),或使用SQL查詢。 SQL查詢是我知道你可以在哪裏給NHibernate一個列名(而不是屬性名)的唯一地方,並要求它對它做些什麼。 – apollodude217 2010-07-07 01:28:26

回答

1

如果你不希望有一個的ParentId屬性,則應廣告私人領域的ParentId,那麼你仍然可以查詢它,但它不是公共的,所以它不是你的應用程序的其他部分可見。

+0

該模型已經開發出來,我無法改變它。 – 2010-07-06 11:01:50

+0

如果你採用dmnonlord的建議,public api不會改變。所以這是一個可能的解決方案。 – mynkow 2010-07-06 11:10:58

+0

我有一個DLL的參考模型,不能改變它。否則,這將是一個更容易的任務:( – 2010-07-06 11:14:58

1

使用Native SQL Query

return session.CreateSQLQuery("select * from ChildTable where ParentId = ?") 
    .AddEntity(typeof(Child)) 
    .SetInt32(0, parentId) 
    .UniqueResult<Child>(); 
+0

SQL查詢是最後的手段,因爲它們消除了(至少)使用NHibernat的主要好處之一全部吃掉。 – apollodude217 2010-07-07 01:14:31

+0

每個現實世界中不重要的NHibernate應用程序都有一些邊界,遺留或性能驅動的情況,其中使用SQL是必要和適當的。直接SQL查詢是一個應該謹慎使用的專用工具,但我不會將它們描述爲「最後的手段」。 – 2010-07-07 11:56:19

1

要在域類使用與NHibernate一列沒有一個屬性,使用可以使用鮮爲人知的空操作訪問:http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx

像這樣的東西(還沒有嘗試過我自己):

<property name="ParentId" access="noop" /> 

我敢打賭,你可以使這更光滑通過映射一個多到一類家長代替。

+0

這似乎並不適用於屬性元素 - 至少我無法得到它。 – 2012-04-15 06:34:04