0

本当にこれを回避しようとしていますが、木々の間から光が見えません。おそらく明らかな何かを見逃しています!

データベース内でオブジェクトを作成すると、どの問題でも機能しますが、値をリストしようとすると、リンクがnullです...

と の 2 つのオブジェクトがありQuestionますResponse。質問には多くの回答が含まれる可能性があるため、モデルは次のとおりです。

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 オブジェクトをデバッグして確認すると、常に null です。

4

1 に答える 1

0

デフォルトでは、NHibernate のすべてのリレーションはレイジーです。したがって、2 つのオプションがあります。応答のマッピングで Not.LazyLoad() または Fetch 戦略を設定するか、データベースのクエリを実行するときにフェッチを実行します。

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

.SetFetchMode(...) を使用する場合、応答のマッピングでフェッチ戦略を設定する必要がある場合があります。これらの 2 つの設定をいじってみてください - 一度に 1 つずつ、または両方

PS: ところで、not.lazyload と fetch が正確にどのように機能しているか混乱しており、それについて質問を投稿しました。FluentNHibernate: LazyLoad と Fetch

于 2012-05-23T12:32:35.433 に答える