2009-06-29 2 views
0

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

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. Как мне это сделать?

ответ

4

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

EDIT:

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

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

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

Мы сделаем SMS только сейчас ...

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

Привет я просто понял, что тип на самом деле в другой таблице означает, что мы имеем что-то вроде этого: Таблица Queue Int ID; название строки; int MessageID; string To; string From; строка Тема; строка Email Таблица Сообщение INT ID INT MessageType Есть еще так или иначе отобразить это? –

+0

Это не работает, сначала вы ссылаетесь на свойство Details, которое не существует, во-вторых, вы новее ссылаетесь на QueueID, который необходим для получения To и From. –

+0

В SMSMessageMap используется таблица Queue, а Id (x => x.Id) будет ссылаться на QueueID. Я не понял, что столбец был назван QueueID, поскольку вы используете «Id» в вопросе. .. Все еще не уверен, что это сработает. :) – ddc0660

Смежные вопросы