1 таблица = 1 класс + 1 один из 2 абстрактных классов - PullRequest
0 голосов
/ 29 июня 2009

У меня есть две таблицы, которые выглядят примерно так

Table Queue
 int ID;
 string Name;
 int MessageID;
 string To
 string From
 string Topic
 string Email

Table Message
 int ID
 int MessageType

Это довольно упрощенная версия, но в классах мы создали 1 класс с именем

 class Queue
 int ID
 string Name
 Message message

И затем у нас есть абстрактное сообщение с любым типом сообщения.

 class abstract Message()

 class SMSMessage : Message
 string ToMobile
 string FromMobile
 string Message

 class EmailMessage
 string ToEmail
 string FromEmail
 string Topic
 string Email

Однако теперь моя проблема в том, чтобы выяснить, как сопоставить это с беглым Nhibernate. Как бы я это сделал?

1 Ответ

4 голосов
/ 29 июня 2009

Я мог бы переписать статью, но думаю, что позволю ей стоять самостоятельно: http://marekblotny.blogspot.com/2009/03/fluent-nhibernate-and-inheritance.html

EDIT:

Работая в духе статьи, я бы попробовал следующее (и я действительно не знаю, сработает ли это):

Написать сообщение map:

public class MessageMap : ClassMap<Message> {
  public MessageMap() {
    Id(x=>x.Id).GeneratedBy.Native();
    // only the common stuff

    DiscriminateSubClassesOnColumn<int>("MessageType")
      .SubClass<SMSMessage>(1, m=>m.HasOne( x=>{
                                                 Map(x=>x.ToMobile);
                                                 Map(x=>x.FromMobile);
                                                 // etc
                                               })
                            .Cascade.SaveUpdate()
                            .FetchType.Join())
      .SubClass<EmailMessage>(2, m=>m.HasOne(x=>{
                                                 Map(x=>x.ToEmail);
                                                 Map(x=>x.FromEmail);
                                                 // etc
                                               })
                            .Cascade.SaveUpdate()
                            .FetchType.Join())
  }
}

Мы сейчас будем делать смс ...

public class SMSMessage : Message {
  public virtual string ToMobile { get; set; }
  public virtual string FromMobile { get; set; }
  ...
}

Вот класс отображения ...

public class SMSMessageMap : ClassMap<SMSMessage> {
  public SMSMessageMap() {
    WithTable("Queue");
    Id(x=>x.Id, "QueueID").GeneratedBy.Foreign("Message");
    Map(x=>x.ToMobile, "To");
    Map(x=>x.FromMobile, "From");
    WithTable("Message", m=>
    {
      m.Map(x=>x.MessageBody);
    });
  }
}
...