У меня есть объект, в котором используется составной идентификатор.Я изменил код, чтобы использовать оборачивание составного идентификатора в отдельный класс ключей.Я ожидал, что с 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;
}
}
}
Рабочие запросы
Запросы ниже работают, и, как вы можете видеть, я сравниваю значения ключей в явном виде.Я не сравниваю ключевой объект.
Linq
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 будут достаточно умными для обработки таких составных идентификаторов в запросах.
Как в запросах linq, так и в критериях API используется сравнение объектов Key..
var key = new AddonStatus.Key
{
Context = context,
AddonType = addonType
};
Linq
from status
in session.Query<AddonStatus>()
where status.Id == key
select status
Criteria API
session.CreateCriteria<AddonStatus>()
.Add(Restrictions.IdEq(key))
Итак, если у кого-то работает такой сценарий, то что я делаю не так?