如何在NHibernate中获取实体列表,其中ParentId可能引用不同的表

时间:2010-10-30 17:49:46

标签: c# nhibernate nhibernate-mapping

我是NHibernate的新手,所以我确信我只是缺少一些基本的东西。

我有一个名为Issue的表,它有一个ParentId列。 ParentId可以引用不同的表(即 - Project或Customer等)。如何在NHibernate中执行该查询,以便我只能显示属于Project的问题。这是我尝试过的。

            DetachedCriteria dCriteria = DetachedCriteria.For<Issue>("issue")
            .SetProjection(Projections.Property("ParentId"))
            .CreateAlias("Project", "project", NHibernate.SqlCommand.JoinType.InnerJoin)
            .Add(Restrictions.EqProperty("issue.ParentId", "project.Id"))
            ;
        var issues = Session.CreateCriteria<Issue>("issue")
                .Add(Subqueries.Exists(dCriteria)).List<Issue>();
        return issues;

我的映射看起来像这样。注意我没有对父对象的任何引用,因为我不知道它将是什么。

    <class name="Issue" table="dbo.Issue" lazy="true">
    <id name="Id" column="Id">
        <generator class="assigned" />
    </id>

    <property name="ParentId" column="ParentId" />

    <property name="Name" />

    <property name="Description" />

我很感激任何指导。

或许我应该多解释一下。我有一个所有问题的网格,我想显示一个类型列,所以我们知道什么类型的问题(项目等)该列没有任何其他目的,除了这一个显示,所以我不相信它是有效的将其添加到数据库中。在SQL中,通过连接或使用Exists过滤数据非常简单。在NHibernate中必须有一个类似的方法,所以我不必遍历每个项目的所有问题。

2 个答案:

答案 0 :(得分:1)

  1. 您不应该直接在对象中使用外键ID - 这是一种以数据为中心的方法。使用NHibernate,您可以使用真实对象或真实对象集合来表示关系。 Nhibernate自动处理数据库中的外键

  2. 我会使用一个接口或基类来表示可以用作父项的不同项,如果你真的需要将一个链接返回到它的父项。但也许你不这样做,因为你最有可能获取,例如一个'客户',然后迭代问题。

  3. 分配的ID通常很糟糕 理念。最好使用类似的东西 HiLo或DBs Native 发生器。

  4. 例如,您的对象可能如下所示:

    public class Issue
    {
       public int Id{ get; set; }
       public IHazIssues Parent { get; set; } //If you really need this
       public string Name { get; set; }
       public string Description { get; set; }
    }
    
    public class Customer : IHazIssues 
    {
       public int Id{ get; set; }
       public IList<Issue> Issues { get; set; }
       public string NAme{ get; set; }
    }
    
    //If you don't need the parent mapping on Item you don't need this.
    public interface IHazIssues 
    {
       IList<Issue> Issues { get; set; }
    }
    

    等...

答案 1 :(得分:0)

这是一个可怕的设计。您至少应该为关系使用不同的列,或者使用其他列来标识类型或父对象。

如果你这样做,你将能够用NHibernate干净地映射它。

如果由于某种原因你不能,那么你可能正在寻找任何映射。