1表= 1类+ 1个抽象类之一

时间:2009-06-29 17:15:21

标签: nhibernate fluent-nhibernate nhibernate-mapping

我有两张看起来像这样的表

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

Table Message
 int ID
 int MessageType

这是一个相当简化的版本,但我们在课程中所做的是创建一个名为

的类
 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 个答案:

答案 0 :(得分:4)

我可以改写这篇文章,但我想我会允许它自立:http://marekblotny.blogspot.com/2009/03/fluent-nhibernate-and-inheritance.html

编辑:

运行本文的精神,我会尝试以下(我真的不知道这是否有效):

撰写留言地图:

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);
    });
  }
}