Еще один свободный вопрос о картографировании Nhibernate - PullRequest
0 голосов
/ 15 сентября 2011

Мне трудно понять, как справиться с картографической ситуацией:

У меня есть разные объекты (скажем, новости и сообщения), которые могут иметь несколько комментариев. Я получаю следующую схему:

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar)
NEWS_COMMENT : NEWS_ID(int), COMMENT_ID(int)
POST_COMMENT : POST_ID(int), COMMENT_ID(int)

Я бы хотел, чтобы мои объекты News и Post имели свойство IList / ICollection Comments.

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

Примечание. В настоящее время я создал NewsMap, PostMap, CommentMap, NewsCommentMap, PostCommentMap, последние два имеют составные элементы ... Но это не работает правильно ...

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

Нет необходимости создавать сопоставления для NEWS_COMMENT и POST_COMMENT.Это отношения от многих ко многим , и они могут отображаться в каждой стороне отношения (NewsMap и PostMap).Пожалуйста, смотрите пример ниже:

public class NewsMap: ClassMap<News>
{
  public NewsMap()
  {
    Table("NEWS");
    Id(x => x.Id);

    HasManyToMany(x => x.Comments)
     .Table("NEWS_COMMENT")
     .ParentKeyColumn("NEWS_ID")
     .ChildKeyColumn("COMMENT_ID")
     .Cascade.All()
     .Inverse();
  }
}
0 голосов
/ 15 сентября 2011

опция1: есть только один класс комментариев

Таблица

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar), NEWS_ID(int), POST_ID(int)

карты

public NewsMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("NEWS_ID")
        .Cascade.AllDeleteOrphan();
}

public PostMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("POST_ID")
        .Cascade.AllDeleteOrphan();
}

или иметь подклассы

таблицы

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar)
NEWS_COMMENT : NEWS_ID(int), COMMENT_ID(int)
POST_COMMENT : POST_ID(int), COMMENT_ID(int)

class Post
{
    public virtual ICollection<PostComment> { get; set; }
}

public PostMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("POST_ID")
        .Cascade.AllDeleteOrphan();
}

public PostCommentMap : SubClassMap<PostComment>
{
    public PostCommentMap()
    {
        Table("POST_COMMENT");
        KeyColumn("COMMENT_ID");
    }
}
...