Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c NHibernate不使用代理包装实体_C#_Nhibernate - Fatal编程技术网

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。所以它应该是有效的。。。但是不。。。