【问题标题】:How can I get a list of entities in NHibernate where the ParentId might refer to different tables如何在 NHibernate 中获取 ParentId 可能引用不同表的实体列表
【发布时间】:2010-10-30 17:49:45
【问题描述】:

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

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

            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 中必须有类似的方法,所以我不必遍历每个项目来解决所有问题。

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping


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

    2. 如果您确实需要问题以返回其父级的链接,我将使用接口或基类来表示可用作父级的不同项目。但可能你不这样做,因为你很可能会获取例如一个“客户”,然后遍历问题。

    3. 分配的 ID 通常是错误的 主意。最好使用类似的东西 HiLo 或 DBs Native 发电机。

    例如,您的对象可能看起来像这样:

    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; }
    }
    

    等等……

    【讨论】:

    • 我添加了一些关于我想要完成的附加信息。我明白你在这里想要做什么,但对于我有限的需求来说,它似乎过于复杂(参见上面的其他 cmets)。
    • 是的,通过这种方法,您可以遍历所有问题,并找出它们所附加的内容。抱歉,如果这看起来过于复杂,但这就是您使用 NHibernate 的方式 - 如果您想采用以数据为中心的方法,为什么要使用它?
    【解决方案2】:

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

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

    如果由于某种原因你不能,也许你正在寻找一个任意映射。

    【讨论】:

    • 诸如“那是一个糟糕的设计”之类的通用语句对于解决问题并没有真正的成效。如果您描述了任何映射的作用或是什么,它可能会有所帮助
    • @Steven,您当然可以在 NHibernate 文档中查找 &lt;any&gt;
    • 这是 Ayende 对该功能的概述:ayende.com/Blog/archive/2006/06/05/…
    • Steven,好吧,当你无法区分你所指的对象类型时,这是一个糟糕的设计!这会造成麻烦和混乱!
    • 正是我所寻找的。我是这种映射方法的新手,因此正在寻找有关如何完成的指导。过去,我避免添加“类型”列,因为可以通过数据库连接简单地过滤掉类型,但 Ayende 在帖子中描述它的方式是有意义的。感谢 Falcon 和 UpTheCreek 的指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多