我是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" />
答案 0 :(得分:1)
您不应该直接在对象中使用外键ID - 这是一种以数据为中心的方法。使用NHibernate,您可以使用真实对象或真实对象集合来表示关系。 Nhibernate自动处理数据库中的外键
我会使用一个接口或基类来表示可以用作父项的不同项,如果你真的需要将一个链接返回到它的父项。但也许你不这样做,因为你最有可能获取,例如一个'客户',然后迭代问题。
分配的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; }
}
等...
答案 1 :(得分:0)
这是一个可怕的设计。您至少应该为关系使用不同的列,或者使用其他列来标识类型或父对象。
如果你这样做,你将能够用NHibernate干净地映射它。
如果由于某种原因你不能,那么你可能正在寻找任何映射。