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) 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中的一个错误

最新更新