0

真的想绕开这个问题,但看不到透过树木的光线。可能错过了一些明显的东西!

在数据库中,当我创建对象时,它可以在任何问题中使用,但是当我尝试列出值时,链接为空......

有两个对象,QuestionResponse。一个问题可以有很多回答,所以这里是模型:

public class Question
{
    public int Id { get; set; }
    public int QuestionNumber { get; set; }
    public string QuestionText { get; set; }
    public IList<Response> Responses { get; set; } 

    public Question()
    {
        Responses = new List<Response>();
    }
}

public class Response
{
    public int Id { get; private set; }
    public Question Question { get; set; }
    public int ResponseValue { get; set; }
    public string ResponseText { get; set; }
}

这是映射:

public class QuestionMap : ClassMap<Question>
{
    public QuestionMap()
    {
        Id(q => q.Id);
        Map(q => q.QuestionNumber);
        Map(q => q.QuestionText).Length(300).Not.Nullable();
        HasMany<Response>(q => q.Responses).Inverse().AsBag();
    }
}

public class ResponseMap : ClassMap<Response>
{
    public ResponseMap()
    {
        Id(x => x.Id);
        References<Question>(x => x.Question).Not.Nullable();
        Map(x => x.ResponseText);
        Map(x => x.ResponseValue);
    }
}

所以当我使用

var responses = _session.CreateCriteria(typeof(Response)).List<Response>();

并调试并查看 Question 对象,它始终为空。

4

1 回答 1

0

默认情况下,NHibernate 中的所有关系都是惰性的。所以你有两个选择。在您的响应映​​射中设置 Not.LazyLoad() 或 Fetch 策略,或者在查询数据库时执行 fetch。

var responses = _session.CreateCriteria(typeof (Response))
                .SetFetchMode("Responses", NHibernate.FetchMode.Eager)
                .List();

当您使用 .SetFetchMode(...) 时,您可能需要在响应的映射中设置获取策略。只需使用这两个设置 - 一次一个或两个

PS:顺便说一句,我很困惑 not.lazyload 和 fetch 究竟是如何工作的,并发布了一个关于此的问题。FluentNHibernate:LazyLoad 和 Fetch

于 2012-05-23T12:32:35.433 回答