Как привязать Comment к конкретному Message
Пишу веб приложение использую Fluent NHibernate. Всё управляется котроллером, а запросы обрабатывают хендлеры. Это гостевая книга, в которой можно оставить сообщения и в каждом сообщении можно оставить комментарий. Приложение общается через API. Вопрос: как добавить коментарий к каждому коменту? Вот поля Message:
namespace TestGuestbook.Data
{
[Guid("6D07675D-1F17-482D-A576-2DDBE5C8C7DF")]
[CJE.Serializable(CJE.Serializable.Politics.AllExceptExcluded)]
public class Message : CJE.ISerializable
{
public Guid ID { get; set; }
public DateTime Created { get; set; }
public string Author { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public IList<Data.Comment> Comments { get; set; }
public int CommentsCount { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestGuestbook.DB
{
public class Message
{
public virtual Guid ID { get; set; }
public virtual DateTime Created { get; set; }
public virtual string Author { get; set; }
public virtual string Title { get; set; }
public virtual string Content { get; set; }
public virtual IList<Comment> Comments { get; set; }
public virtual IList<Rating> Ratings { get; set; }
public Message() { }
public Message(Data.Message source)
{
this.ID = source.ID;
this.Created = source.Created;
this.Author = source.Author;
this.Title = source.Title;
this.Content = source.Content;
}
public virtual Data.Message ToData(bool withComments, bool withRating)
{
return new Data.Message()
{
ID = this.ID,
Created = this.Created,
Author = this.Author,
Title = this.Title,
Content = this.Content,
Comments = (withComments && this.Comments != null && NHibernate.NHibernateUtil.IsInitialized(this.Comments)) ? this.Comments.Select(x => x.ToData()).ToList() : new List<Data.Comment>(),
CommentsCount = (this.Comments != null && NHibernate.NHibernateUtil.IsInitialized(this.Comments)) ? this.Comments.Count : -1,
};
}
}
}
Все эти поля "замаплены". Вот их поля:
namespace TestGuestbook.DB.Mapping
{
public class MessageMap : ClassMap<Message>
{
public MessageMap()
{
Id(x => x.ID).GeneratedBy.GuidComb();
Map(x => x.Created);
Map(x => x.Author);
Map(x => x.Title);
Map(x => x.Content);
HasMany(x => x.Comments).KeyColumns.Add("Message_id").Inverse().Cascade.All();
HasMany(x => x.Ratings).KeyColumns.Add("Message_id").Cascade.AllDeleteOrphan();
}
Вот поля Comment
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace TestGuestbook.Data
{
[CJE.Serializable(CJE.Serializable.Politics.AllExceptExcluded)]
[Guid("6D07675D-1F17-482D-A576-2DDBE5C8C7DF")]
public class Comment : CJE.ISerializable
{
public Guid ID { get; set; }
public DateTime Created { get; set; }
public string Author { get; set; }
public string Content { get; set; }
public Message Message { get; set; }
}
}
public class Comment
{
public virtual string Author { get; set; }
public virtual string Content { get; set; }
public virtual DateTime Created { get; set; }
public virtual Guid ID { get; set; }
public virtual Message Message { get; set; }
public Comment() { }
public Comment(Data.Comment source)
{
this.ID = source.ID;
this.Author = source.Author;
this.Content = source.Content;
this.Created = source.Created;
}
}
namespace TestGuestbook.DB.Mapping
{
public class CommentMap : ClassMap<Comment>
{
public CommentMap()
{
Id(x => x.ID).GeneratedBy.Guid();
Map(x => x.Content);
Map(x => x.Author);
References(x => x.Message).Column("Message_id").Cascade.All();
}
}
}
Я получаю данные с помощью форм. Как получить ID сообщения, чтобы добавить комментарий? Вот форма Comment
namespace TestGuestbook.Form
{
public class Comment : CJE.Form.FormData
{
public Comment(CJE.Form.DataRaw data) : base(data, true) { }
[CJE.Form.Value("ID", typeof(CJE.Form.Values.GuidParser))]
public Guid ID;
[CJE.Form.Value("Created", typeof(CJE.Form.Values.DateTimeParser))]
public DateTime Created;
[CJE.Form.Value("Author", typeof(CJE.Form.Values.StringParser))]
public string Author;
[CJE.Form.Value("Content", typeof(CJE.Form.Values.StringParser))]
public string Content;
[CJE.Form.Value("Message_id", typeof(CJE.Form.Value))]
public Message MessageID;
public Data.Comment ToData()
{
return new Data.Comment()
{
ID = this.ID,
Created = this.Created,
Author = this.Author,
Content = this.Content,
};
}
}
}
Вот контроллер, который добавляет комментарий если ID = null, в противном случае редактирует тот, который имеется:
ublic static Data.Comment SaveComment(IDBSession dbs, Data.Comment comment, Guid messageID)
{
using (NHibernate.ITransaction transaction = dbs.Session.BeginTransaction())
{
DB.Comment dbComment = null;
if (comment.ID != Guid.Empty) dbComment = dbs.Session.Get<DB.Comment>(comment.ID);
if (dbComment == null)
{
dbComment = new DB.Comment(comment);
dbComment.Created = DateTime.UtcNow;
}
else
{
dbComment.Author = comment.Author;
dbComment.Content = comment.Content;
}
dbs.Session.SaveOrUpdate(dbComment);
comment = dbComment.ToData();
transaction.Commit();
}
return comment;
}