我有一个表格:
CREATE TABLE [dbo].[GroupPhrases](
[GroupId] [int] NOT NULL,
[PhraseId] [int] NOT NULL,
[Quality] [float] NOT NULL,
[VerdictsCount] [int] NOT NULL,
[IntersectionPercentage] [float] NULL,
[VerdictIds] [varbinary](max) NOT NULL,
[RelevanceResult] [varbinary](max) NOT NULL,
CONSTRAINT [PK_GroupPhrases] PRIMARY KEY CLUSTERED
(
[GroupId] ASC,
[PhraseId] ASC
) ON [PRIMARY]
这是表的实体:
public class GroupPhraseEntity
{
public virtual int GroupId { get; set; }
public virtual PhraseEntity Phrase { get; set; }
public virtual double Quality { get; set; }
public virtual int VerdictsCount { get; set; }
public virtual double? IntersectionPercentage { get; set; }
public virtual byte[] VerdictIds { get; set; }
public virtual byte[] RelevanceResult { get; set; }
public override bool Equals(object obj)
{
var castObj = obj as GroupPhraseEntity;
if (castObj == null)
{
return false;
}
return (GroupId == castObj.GroupId) && (Phrase.Id == castObj.Phrase.Id);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
这是映射:
public class GroupPhraseEntityMap : ClassMapping<GroupPhraseEntity>
{
public GroupPhraseEntityMap()
{
Table("GroupPhrases");
ComposedId(map =>
{
map.Property(x => x.GroupId);
map.ManyToOne(x => x.Phrase, m =>
{
m.Column("PhraseId");
});
});
Property(x => x.Quality);
Property(x => x.IntersectionPercentage);
Property(x => x.VerdictsCount);
Property(x => x.VerdictIds, m =>
{
m.Column("VerdictIds");
m.Type(NHibernateUtil.BinaryBlob);
m.Length(Int32.MaxValue);
m.Lazy(true);
});
Property(x => x.RelevanceResult, m =>
{
m.Column("RelevanceResult");
m.Type(NHibernateUtil.BinaryBlob);
m.Length(Int32.MaxValue);
m.Lazy(true);
});
}
}
这是应该返回相关性结果字段值的方法:
public RelevanceResult GetGroupRelevanceResult(int groupId, int phraseId)
{
using (var session = _sessionManager.GetSession())
{
var groupPhrase = session.Query<GroupPhraseEntity>().FirstOrDefault(x => (x.GroupId == groupId) && (x.Phrase.Id == phraseId));
if (groupPhrase == null)
{
return null;
}
return Deserialize<RelevanceResult>(groupPhrase.RelevanceResult);
}
}
但是该方法让我失败了,因为相关性结果属性没有加载!!我看到查询返回的我没有用代理对象包装,并且字段相关性结果保持为空。任何想法为什么会这样?
多谢!
RelevanceRankingResult
是一个惰性属性。如果_sessionManager.GetSession()
返回一个IStatelessSession
,则需要显式Select()
它(以及要在Deserialize()
中输出的所有其他列
我发现问题出在映射中使用ComposedId。我已将字段 ID 添加到表中并删除了组合 ID。它解决了这个问题。但它看起来像NHibernate中的一个错误