2009-06-29 17 views
0

ich zwei Tabellen, die Dies ist eine eher vereinfachte Version so etwas wie diese1 Tisch = 1 Klasse + 1 eines von 2 abstrakter Klasse

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

Table Message 
int ID 
int MessageType 

aussehen, aber was wir in den Klassen taten, war 1 Klasse erstellen benannt

class Queue 
int ID 
string Name 
Message message 

Und dann haben wir eine abstrakte Nachricht mit beiden Arten von Nachricht.

Aber jetzt ist mein Problem herauszufinden, wie man dies mit flüssigem Nhibernate abbildet. Wie würde ich das tun?

Antwort

4

konnte ich den Artikel neu zu schreiben, aber ich denke, ich werde erlauben es auf eigenen Beinen stehen: http://marekblotny.blogspot.com/2009/03/fluent-nhibernate-and-inheritance.html

EDIT:

mit dem Geist des Artikels Rennen, würde ich folgendes versuchen (und ich habe wirklich keine Ahnung, ob dies funktionieren wird):

Nachricht Karte schreiben:

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

Wir SMS tun, nur jetzt ...

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

Hier ist die Mapping-Klasse ...

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

Hallo Ich fand heraus, nur, dass der Typ eigentlich in einer anderen Tabelle, die wir haben so etwas wie dies bedeutet: Table Queue ID int; Zeichenfolge Name; int Nachrichten-ID; Zeichenfolge An; Zeichenfolge Von; string Thema; String E-Mail Tabelle Nachricht int ID int Message Gibt es trotzdem noch diese abzubilden? –

+0

Dies würde nicht funktionieren, zuerst beziehen Sie sich auf eine Details-Eigenschaft, die nicht existiert, zweitens beziehen Sie sich neuere auf die QueueID, die notwendig ist, um das An und Von zu bekommen. –

+0

Die SMSMessageMap verwendet die Queue-Tabelle und die ID (x => x.Id) würde auf die QueueID verweisen. Ich wusste nicht, dass die Spalte QueueID heißt, da Sie in der Frage "Id" verwenden. .. immer noch nicht sicher, es wird funktionieren. :) – ddc0660

Verwandte Themen