我有一个使用复合 id 的实体。我更改了代码以利用将复合 id 包装在单独的键类中。我希望使用 Linq 可以对关键对象和 Criteria API 进行比较以使用 Restrictions.IdEq 但两者都失败了。我需要明确比较关键值以使其工作。
如果这应该起作用,我找不到任何文档,所以目前我坚持直接比较,但这意味着当我更改密钥时,我还需要更新查询代码,这显然不是我想要的。
附带说明一下,我在 NHibernate 3.0.0 Alpha 2 和 3 中进行了尝试。
领域
映射
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="Cwc.Pulse.Dal"
namespace="Cwc.Pulse.Dal">
<class name="AddonStatus">
<composite-id name="Id">
<key-many-to-one name="Context" column="Context_Id" class="Context" />
<key-property name="AddonType" column="Addon_Id"/>
</composite-id>
<property name="Status" />
</class>
</hibernate-mapping>
班级
public class AddonStatus
{
public virtual string Status { get; set; }
public virtual Key Id { get; protected set; }
public AddonStatus()
{
Id = new Key();
}
public class Key
{
public virtual Context Context { get; set; }
public virtual AddonType AddonType { get; set; }
public override int GetHashCode()
{
return ContextId.GetHashCode() ^ AddonType.GetHashCode();
}
public override bool Equals(object obj)
{
if (this == obj) return true;
var o = obj as Key;
if (null == o) return false;
return Context == o.Context && AddonType == o.AddonType;
}
}
}
工作查询
下面的查询有效,如您所见,我明确比较了键值。我不比较关键对象。
林克
from status
in session.Query<AddonStatus>()
where status.Id.Context == context && status.Id.AddonType == addonType
select status
标准 API
session.CreateCriteria<AddonStatus>()
.Add(Restrictions.Eq("Id.Context", context))
.Add(Restrictions.Eq("Id.AddonType", addonType))
预计工作,但不
我希望以下查询能够正常工作。要么在内存而不是数据库中有效地使用 linq,但我希望标准 api 足够聪明,可以处理查询中的此类复合 id。
linq 和条件 api 查询都使用 Key 对象比较。
var key = new AddonStatus.Key
{
Context = context,
AddonType = addonType
};
林克
from status
in session.Query<AddonStatus>()
where status.Id == key
select status
标准 API
session.CreateCriteria<AddonStatus>()
.Add(Restrictions.IdEq(key))
因此,如果有人有这样的场景工作,那么我做错了什么?