Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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# Fluent NHibernate多对多映射保存所有项,但不获取所有项_C#_Sql_Asp.net Mvc_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# Fluent NHibernate多对多映射保存所有项,但不获取所有项

C# Fluent NHibernate多对多映射保存所有项,但不获取所有项,c#,sql,asp.net-mvc,nhibernate,fluent-nhibernate,C#,Sql,Asp.net Mvc,Nhibernate,Fluent Nhibernate,我有一张课程表: CourseID Name -------------------- 1 Course 1 2 Course 2 3 Course 3 测验表: QuizID CourseID Name ---------------------------- 1 1 Quiz 1 2 1 Quiz 2 3 1

我有一张课程表:

CourseID    Name
--------------------
1           Course 1
2           Course 2
3           Course 3
测验表:

QuizID    CourseID    Name
----------------------------
1         1           Quiz 1
2         1           Quiz 2
3         1           Quiz 3
问题表:

QuestionID    Text
-----------------------------
1             What is foo?
2             What is bar?
3             What is foobar?
QuizID    QuestionID
--------------------
1         1
1         2
2         2
2         3
还有一个提问表:

QuestionID    Text
-----------------------------
1             What is foo?
2             What is bar?
3             What is foobar?
QuizID    QuestionID
--------------------
1         1
1         2
2         2
2         3
管理这些数据的前端看起来是这样的,我希望我能对它的外观有更多的发言权:

用户界面可能并不重要,但希望它能给你一个更好的想法。我正在使用Fluent NHibernate进行以下映射:

public class CourseMapOverride : IAutoMappingOverride<Course>
{
    public void Override( AutoMapping<Course> mapping )
    {
        mapping.Table( "Course" );

        mapping.Id( x => x.Id ).Column( "CourseID" );

        mapping.HasMany( x => x.Exams )
               .KeyColumn( "CourseID" )
               .Cascade.All()
               .Inverse();
    }
}

public class ExamMapOverride : IAutoMappingOverride<Exam>
{
    public void Override( AutoMapping<Exam> mapping )
    {
        mapping.Table( "Quiz" );

        mapping.Id( x => x.Id ).Column( "QuizID" );

        mapping.References( x => x.Course ).Column( "CourseID" );

        mapping.HasManyToMany( x => x.Questions )
               .Table( "QuizQuestion" )
               .ParentKeyColumn( "QuizID" )
               .ChildKeyColumn( "QuestionID" )
               .Cascade.All();
    }
}

public class QuestionMapOverride : IAutoMappingOverride<Question>
{
    public void Override( AutoMapping<Question> mapping )
    {
        mapping.Table( "Question" );

        mapping.Id( x => x.Id ).Column( "QuestionID" );

        mapping.HasManyToMany( x => x.Exams )
               .Table( "QuizQuestion" )
               .ParentKeyColumn( "QuestionID" )
               .ChildKeyColumn( "QuizID" )
               .Cascade.All()
               .Inverse();
    }
}
例如,我选择以下复选框:

发布表单后,我可以通过查看数据库中的QuizQuestion表来验证是否添加了新行:

QuizID    QuestionID
--------------------
1         1
1         2
2         2
2         3
3         1
3         3
但是,由于某些原因,新行不是下一页显示的数据集的一部分。保存/提交/刷新/重定向后,下一页看起来与之前完全相同:

视图没有问题,因为当我在下面的GetQuestionModel方法的foreach循环中暂停调试器时,exam.Questions是空的:

public CourseModel GetCourseModel( int courseID )
{
    var course = CourseRepository.Get( courseID );

    var questions = QuestionRepository.GetAll()
                                      .Select( q => GetQuestionModel( course.Exams, q ) )
                                      .ToList();

    return new CourseModel
               {
                   CourseID = course.ID,
                   Name = course.Name,
                   Questions = questions,
               };
}

public QuestionModel GetQuestionModel( IEnumerable<Exam> exams, Question question )
{
    var model = new QuestionModel
                    {
                        QuestionID = question.ID,
                        Text = question.Text,
                        ExamQuestions = new List<ExamQuestionModel>(),
                    };
    
    foreach ( var exam in exams )
    {
        // exam.Questions is empty when exam.ID is 3
        var examQuestionIDs = exam.Questions.Select( q => q.ID );
        
        model.ExamQuestions.Add( new ExamQuestionModel
                                     {
                                         ExamID = exam.ID,
                                         QuestionID = question.ID,
                                         Selected = examQuestionIDs.Contains( question.ID ),
                                     } );
    }
    
    return model;
}
下面是Repository类中的GetAll方法:

public virtual IQueryable<T> GetAll()
{
    return LinqExtensionMethods.Query<T>( this.Session );
}
最奇怪的是,如果我重新构建解决方案,问题就会自行解决。但它必须是一个重建,或者是一个代码更改,然后是一个构建

这让我发疯。我做错了什么

编辑 我怀疑这与NHibernate缓存有关,所以我申请了。但是运气不好

编辑2
正如我前面所说,重建会以某种方式刷新数据。我可以在测验中添加几个ID为3的问题,重建后,这些问题出现在列表中。然后我删除了join表中的所有行,但问题仍然在列表中。我现在更确信这可能是NHibernate缓存的问题。

我终于找到了问题:

var questions = QuestionRepository.GetAll()
                                  .Select( q => GetQuestionModel( course.Exams, q ) )
                                  .ToList();
应该是:

var questions = QuestionRepository.GetAll()
                                  .ToList()
                                  .Select( q => GetQuestionModel( course.Exams, q ) )
                                  .ToList();
似乎每次我和NHibernate之间都有一个令人沮丧的难题,那是因为我错过了一个打给ToList的电话。这真的开始让我心烦意乱了