2014-09-16 3 views
0

У меня есть дочернее, родительское отношение в моем приложении. Например, сообщение One может иметь много комментариев (отношение «Один ко многим»). Ive завершил код для сопоставления, мне нужно написать код, поэтому, когда я вставляю его в DB, ​​он также вставляет родительский идентификатор. На данный момент мой код не вставляет родительский идентификатор, только вставляет другие сведения о child.Can, кто-то поможет мне развернуть мой код, пожалуйста?Обновление внешнего ключа с использованием ASP.NET MVC и NHibernate

Модель:

namespace MvcApplication7.Models 
{ 
    public class Post 
    { 
     public virtual int Id { get; set; } 
     [Display(Name = "Post")] 
     public virtual string PostText { get; set; } 
     public virtual IList<Comment> Comments { get; set; } 
    } 
} 

namespace MvcApplication7.Models 
{ 
    public class Comment 
    { 
     public virtual int Id { get; set; } 
     public virtual Post Post { get; set; } 

     [Display(Name = "Comments")] 
     public virtual string CommentText { get; set; } 
    } 
} 

NHibenate Отображение:

<?xml version="1.0" encoding="utf-8" ?> 
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="MvcApplication7" namespace="MvcApplication7.Models"> 

     <class name="Post" table="Posts" dynamic-update="true" > 
     <cache usage="read-write"/> 
     <id name="Id" column="Id" type="int"> 
      <generator class="sequence"> 
      <param name="sequence">posts_id_seq</param> 
      </generator> 
     </id> 
     <property name="PostText" column="Post"/> 
     <bag name="Comments" inverse="true" lazy="true" > 
      <key column="PostId"/> 
      <one-to-many class="Comment"/> 
     </bag> 
     </class> 

     <class name="Comment" table="Comments" dynamic-update="true" > 
     <cache usage="read-write"/> 
     <id name="Id" column="CommentId" type="int"> 
      <generator class="sequence"> 
      <param name="sequence">comments_commentid_seq</param> 
      </generator> 
     </id> 
     <property name="CommentText" column="Comment"/> 
     <many-to-one name="Post" class="Post" column="PostId" /> 
     </class> 

    </hibernate-mapping> 

таблица базы данных:

CREATE TABLE comments 
(
    commentid serial NOT NULL, 
    postid integer, 
    comment text, 
    CONSTRAINT commentid PRIMARY KEY (commentid), 
    CONSTRAINT postid FOREIGN KEY (postid) 
     REFERENCES posts (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE comments 
    OWNER TO postgres; 
********************************************************* 
CREATE TABLE posts 
(
    id serial NOT NULL, 
    post text, 
    CONSTRAINT id PRIMARY KEY (id) 
) 
WITH (
    OIDS=FALSE 
); 
ALTER TABLE posts 
    OWNER TO postgres; 

Код, который нуждается в обновлении является контроллером MVC, который выглядит следующим образом:

public ActionResult Create() 
    { 
     return View(); 
    } 


    [HttpPost] 
    public ActionResult Create(Comment comments) 
    { 
     try 
     { 
      using (ISession session = NHIbernateSession.OpenSession()) 
      { 
       using (ITransaction transaction = session.BeginTransaction()) 
       { 
        session.Save(comments); 
        transaction.Commit(); 
       } 
      } 

      return RedirectToAction("Index"); 
     } 
     catch (Exception exception) 
     { 
      return View(); 
     } 
    } 
+0

Вы устанавливаете свойство 'Post'' комментария' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Это все, что вам нужно делать. –

+0

То, что я сделал, но когда я вставляю новый комментарий, внешний ключ пуст, поэтому я подумал, может быть, я что-то потерял в контроллере, где я вставляю новую запись в БД. @ tom.dietrich – Diana

+0

Не могли бы вы разместить код, в котором вы выполняете эту связь? –

ответ

2

Я не вижу кода, в котором вы связываете свои новые Comment s с Post.

// Somehow get the target Post and store it the post variable, then 
post.Comments.Add(comments) 
comments.Post = post; 

Session.Save(comments); 
Session.Save(post); 
Session.Commit(); 
+0

Спасибо за ваш ответ. что вы подразумеваете под: «Как-то получить целевой пост и сохранить его пост-переменную, а затем». Также, где мне нужно написать код, который вы опубликовали? @ tom.dietrich – Diana

+1

В идеале у вас должен быть репозиторий, в котором вы будете взаимодействовать с NHibernate, но вы, похоже, решили использовать это в своем действии Controller, поэтому этот код будет действовать в действии вашего контроллера. Что касается получения целевого поста, у меня недостаточно базы кода, чтобы рассказать, как это должно работать. Если у вас есть ID для сообщения, переданного в действие вашего контроллера, вы можете получить его в запросе NHibernate. –

+0

Можете ли вы объяснить, как я могу это сделать с репозиторием, пожалуйста? @ tom.dietrich – Diana

0

Изменить сообщение свой класс, как этот

public class Post 
{ 
    public virtual int Id { get; set; } 
    [Display(Name = "Post")] 
    public virtual string PostText { get; set; } 
    public virtual IList<Comment> Comments { get; protected set; } 

    public Post() 
    { 
     Comments = new List<Comment>(); 
    } 

    public virtual void AddComment(Comment comment) 
    { 
     if (!Comments.Contains(comment)) 
     { 
      Comments.Add(comment); 
      comment.Post = this; 
     } 
    } 
} 

И в контроллере получить сообщение с помощью сессии и добавить комментарий к ней.

Смежные вопросы