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的电话。这真的开始让我心烦意乱了