2010-07-06 69 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