C# c NHibernate不使用代理包装实体
我有一张桌子:C# c NHibernate不使用代理包装实体,c#,nhibernate,C#,Nhibernate,我有一张桌子: 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) N
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);
});
}
}
下面是应该返回RelevanceResult字段值的方法:
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);
}
}
但是这个方法失败了,因为RelevanceResult属性没有加载!!!我看到查询返回我没有使用代理对象包装,字段RelevanceResult保持为空。
你知道为什么吗
非常感谢 RelevanceRankingResult是一个惰性属性。如果_sessionManager.GetSession返回IStatelessSession,则需要显式选择它以及要在反序列化中输出的所有其他列。我发现问题在于在映射中使用ComposeId。我已将字段Id添加到表中,并删除了ComposeId。它解决了这个问题。但它看起来像是NHibernate中的一个bug您得到的是null还是异常?您是否查看了生成的sql?我得到null,结果反序列化方法中出现异常您是否查看了生成的sql?您可以使用它。它不会加载sql中的惰性字段。没关系。有什么不好的,当我试图在代码中获取惰性字段值时,它没有加载它。。。原因是——加载的实体没有被NHibernate代理包装。所以sql在这里不相关,但在这里它是:选择groupphras0\u0.GroupId作为Groupi1\u5\u0\u0,groupphras0\u0.PhraseId作为Prasei2\u5\u0,groupphras0\u0.Quality作为quality3\u5\u0\u0,groupphras0\u0.verdicts作为verdict4\u5\u0\u0,groupphras0_u0.IntersectionPercentage as Inters5_5_0_0来自groupphras0,其中groupphras0_0.GroupId=@p0和groupphras0_0.PhraseId=@p1尝试获取数据:session.Query.Fetchx=>x.RelevanceResult.FirstOrDefaultx=>x.GroupId==GroupId&&x.PhraseId==PhraseId您应该已经这样做了,因为它很懒,你只想要相关的结果。也许这可以解决您的问题。不,_sessionManager.GetSession返回ISession。所以它应该是有效的。。。但是不。。。