Чтобы вставить значение в внешний ключ в mvc3 nihibernate - PullRequest
0 голосов
/ 20 марта 2012

Я делаю приложение с именем Форум вопросов и ответов, используя nhibernate в mvc3. На первой странице у меня отображается список вопросов, отображаемый в виде ссылки, и когда я нажимаю на щелчок, он направляет меня на страницу ответов.

Структура таблицы:

Таблица вопросов:

QuestionID int
Question nvarchar(255)
Created_Date datetime
Modified_Date datetime
Created_By int
Modified_By int
Deleted nchar(1)

Таблица ответов:

Id int
Answer nvarchar(255)
Created_Date datetime 
Modified_Date datetime  
Created_By int 
Modified_By  int
QuestionID int 
Deleted  nchar(1)

Это классы моделей:

public class Question_Page
{
 public virtual int Id { get; set; }
 public virtual string Question_name { get; set; }
 public virtual DateTime Created_Date { get; set; }
 public virtual DateTime Modified_Date { get; set; }
 public virtual int Created_By { get; set; }
 public virtual int Modified_By { get; set; }
 public virtual char Deleted { get; set; }

 public Question_Page()
{
    this.Deleted='F';
}

}

public class Answer_Page
{
public virtual int Id { get; set; }
public virtual string Answer { get; set; }
public virtual DateTime Created_Date { get; set; }
public virtual DateTime Modified_Date { get; set; }
public virtual int Created_By { get; set; }
public virtual int Modified_By { get; set; }
public virtual char Deleted { get; set; }
public virtual Question_Page Question { get; set; }
public virtual int QuestionID{get;set;}
public Answer_Page()
{
    this.Deleted='F';
}
}

и мои файлы сопоставления: для страницы вопросов

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly ="Core" namespace ="Core.Model" >
<class name ="Question_Page" >
<id name="Id">
<generator class="native" />
</id>
<property name="Question_name"    />
<property name="Created_Date"  />
<property name="Modified_Date"  />
<property name="Created_By"  />
<property name="Modified_By"  />
<property name="Deleted"/>
</class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly ="Core" namespace ="Core.Model" >
<class name ="Answer_Page" >
<id name="Id">
<generator class="native" />
</id>
<property name="Answer"    />
<property name="Created_Date"  />
<property name="Modified_Date"  />
<property name="Created_By"  />
<property name="Modified_By"  />
<property name="Deleted"/>
<property name="QuestionID"/>
<many-to-one class="Core.Model.Question_Page" name="Question" column="QuestionID" foreign- key="fk_Question_Answer" />
</class>
</hibernate-mapping>

я сделал идентификатор из класса Question_page в качестве внешнего ключа в классе Answer_page

Теперь в моем контроллере при сохранении данныхв классе Answer_Page:

 public ActionResult Answer(Answer_Page ans, string PostyourAnswer,Question_Page que)
    {
        ans.Answer = PostyourAnswer;
        ans.Created_Date = DateTime.Now;
        ans.Modified_Date = DateTime.Now;
        ans.Created_By = 101;
        ans.Modified_By = 101;
        ans.QuestionID = que.Id;
        new Answer().SaveOrUpdateStudent(ans);
        return View(new Answer().GetAllStudents());
    }

Я получаю сообщение об ошибке «Объект не инициализирован к экземпляру», даже если я передаю статическое значение ans.Question.Id = que.Id;все же я получаю ту же ошибку, пожалуйста, скажите мне, как я должен присвоить значение моему внешнему ключу

1 Ответ

0 голосов
/ 20 марта 2012

Мне кажется, я вижу проблему, вы связали вопрос с ответом в файле сопоставления ответов, но вы не поместили QuestionId ни в файл сопоставления ответов, ни в класс ответа.

Изменить эту строку:

ans.Question.Id = que.Id;

до (после того, как вы добавили QuestionId в отображение и класс ответа):

ans.QuestionId = que.Id;

Причина, по которой вы получили эту ошибку, заключается в том, что вы правильно связали объект Question в отображении, но вы не указали столбец, в котором NHibernate может найти объект Question, поэтому это нулевой объект.

Попробуйте сохранить ответ с новым заполненным параметром QuestionId, затем загрузите его в свое приложение и попробуйте поместить объект Watch в объект Watch, вы должны увидеть его полностью загруженным.

Надеюсь, это поможет.

...