Nhibernate 1表=1类+;2个抽象类中的1个

Nhibernate 1表=1类+;2个抽象类中的1个,nhibernate,fluent-nhibernate,nhibernate-mapping,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 然后我们有一个抽象消息,它有

我有两张像这样的桌子

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
然而现在我的问题是如何用fluent Nhibernate映射这个。
我该怎么做呢?

我可以重写这篇文章,但我想我会允许它独立存在:

编辑:

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

编写消息映射:

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 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);
    });
  }
}
公共类SMSMessageMap:ClassMap{
公共SMSMessageMap(){
WithTable(“队列”);
Id(x=>x.Id,“QueueID”).GeneratedBy.Foreign(“消息”);
Map(x=>x.ToMobile,“To”);
Map(x=>x.FromMobile,“From”);
WithTable(“消息”,m=>
{
m、 Map(x=>x.MessageBody);
});
}
}

我可以重写这篇文章,但我想我会允许它独立存在:

编辑:

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

编写消息映射:

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 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);
    });
  }
}
公共类SMSMessageMap:ClassMap{
公共SMSMessageMap(){
WithTable(“队列”);
Id(x=>x.Id,“QueueID”).GeneratedBy.Foreign(“消息”);
Map(x=>x.ToMobile,“To”);
Map(x=>x.FromMobile,“From”);
WithTable(“消息”,m=>
{
m、 Map(x=>x.MessageBody);
});
}
}

Hi我刚刚发现该类型实际上在另一个表中,这意味着我们有如下内容:table Queue int ID;字符串名;int-MessageID;串到;串从;字符串主题;字符串电子邮件表Message int ID int MessageType是否仍有映射此项?这不起作用,首先您引用的是不存在的详细信息属性,其次您引用的是获取收件人和发件人所必需的QueueID。SMSMessageMap使用队列表,ID(x=>x.ID)将引用QueueID。我不知道列名为QueueID,因为您在问题中使用了“Id”。。仍然不确定它是否会起作用。:)嗨,我刚刚发现该类型实际上在另一个表中,这意味着我们有如下内容:表队列int ID;字符串名;int-MessageID;串到;串从;字符串主题;字符串电子邮件表Message int ID int MessageType是否仍有映射此项?这不起作用,首先您引用的是不存在的详细信息属性,其次您引用的是获取收件人和发件人所必需的QueueID。SMSMessageMap使用队列表,ID(x=>x.ID)将引用QueueID。我不知道列名为QueueID,因为您在问题中使用了“Id”。。仍然不确定它是否会起作用。:)