我正在尝试将NHibernate与一个在概念上等同于以下内容的数据库一起使用:
CREATE TABLE Survey(ID int, SurveyName varchar(max))
CREATE TABLE Question(ID int, QuestionText varchar(max))
CREATE TABLE SurveyQuestion(SurveyID int, QuestionID int, Order int, Required bit)
CREATE TABLE AnsweredSurvey(ID int, SurveyID int, AnsweredBy varchar(max))
CREATE TABLE AnsweredQuestion(ID int, AnsweredSurveyID int, QuestionID int, Answer varchar(max))
每当用户进行调查时,都会从模板表中填充AnsweredSurvey / AnsweredQuestion表。这是由另一个应用程序执行的,所以我只是从这些表中读取数据。我无法控制数据或架构。
我遇到问题的实体是:
class AnsweredQuestion {
int Id;
AnsweredSurvey AnsweredSurvey;
SurveyQuestion SurveyQuestion;
}
请注意,它具有SurveyQuestion类型的属性,而不是普通问题。我希望能够根据AnsweredQuestion的QuestionID和父AnsweredSurvey的SurveyID来填充此属性。有没有一种直接的方法在NHibernate中以这种方式映射这些实体?我正在使用FluentNHibernate,但纯HBM解决方案至少会指引我朝着正确的方向发展。
为完整起见,以下是其他实体:
class Survey {
int Id;
string SurveyName;
IEnumerable<SurveyQuestion> SurveyQuestions;
}
class Question {
int Id;
string QuestionText;
}
class SurveyQuestion {
Survey Survey;
Question Question;
int Order;
bool Required;
}
class AnsweredSurvey {
int Id;
Survey Survey;
IEnumerable<AnsweredQuestion> AnsweredQuestions;
}
感谢您的时间!
答案 0 :(得分:0)
您的模型和架构的问题是映射SurveyQuestion实体/表,因为它具有您要映射到两个多对一关联的复合键。这可以做到但我从未使用过它。
使用流利的nhibernate的例子:
SurveyQuestionMap()
{
CompositeId()
.KeyReference(x => x.Survey, "SurveyID")
.KeyReference(x => x.Question, "QuestionID");
// the rest
}
其他类应该没问题。 例如:
AnsweredSurveyMap()
{
Id(x => x.Id)
References(x => x.Survey);
HasMany(c => c.AnsweredQuestions)
.Inverse()
.Cascade.All()
.KeyColumn("AnsweredSurveyID");
}
您可能需要根据配置的流畅的nhibernate约定设置指定更多键列/表。