2009-03-30 3 views
2

Ich habe ein Modell, bei dem mehrere Klassen eine Liste von Werttypen haben:NHibernate: Karte derselben Klasse auf mehrere Tabellen in Abhängigkeit von Eltern

class Foo { public List<ValType> Vals; } 
class Bar { public List<ValType> Vals; } 

Foo und Bar sind unabhängig davon abgesehen, dass sie diese beiden vals enthalten. Die Regeln zum Hinzufügen, Entfernen usw. der ValTypes sind für jede Klasse unterschiedlich. Ich möchte dieses Design in meinem Code behalten.

Es gibt Zeiten, wenn ich zum Beispiel einige Vals von einem Foo in einen Bar kopieren möchte. In der Datenbank hat jeder ValType seine eigene Tabelle, um sie klein zu halten, leicht (sie hat nur die Eltern-ID + 2 Felder) und erlaubt Integritätsprüfungen. Ich weiß, dass NHibernate sagt, ich sollte meine Objekte so granular wie die Datenbank behalten, aber das macht meinen Code nur hässlicher.

Das Beste, was ich bis jetzt gedacht habe, ist separate Unterklassen von ValType, eine für jedes Elternteil. Dann kann ich diese auf dieser Ebene abbilden. Dann schließe ich Logik hinzufügen und entfernen, um zwischen den richtigen Unterklassen automatisch zu konvertieren und sie tatsächlich in einer privaten Liste zu speichern, die den richtigen Unterklasse-Typ hat. Aber das schien etwas verworren.

Wie kann ich dies in NHibernate (Fluent NHibernate wenn möglich) zuordnen?

Bitte lassen Sie mich wissen, wenn dies ein Duplikat ist - ich bin mir nicht ganz sicher, wie man das sucht.

Antwort

2

können Sie ein Beispiel auf dem Google Code page for Fluent NHibernate zu finden.

Modell

public class Customer 
{ 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

Schema

table Customer (
    Id int primary key 
    Name varchar(100) 
) 

table CustomerAddress (
    CustomerID int, 
    Address varchar(100) 
) 

Mapping

public class CustomerMap : ClassMap<Customer> 
{ 
    public CustomerMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 

     WithTable("CustomerAddress", m => 
     { 
      m.Map(x => x.Address); 
     }); 
    } 
} 

In diesem Beispiel ist eine Einheit, sp leuchtet über zwei Tabellen in der Datenbank. Diese Tabellen sind auf ihren Schlüsseln eins zu eins verbunden. Mit der WithTable-Funktion können Sie NHibernate anweisen, diese beiden Tabellen als eine Entität zu behandeln.

+0

Hmm das wäre peinlich: P. Ich werde das überprüfen! – MichaelGG

+3

Ich sehe, dass der Link nicht mehr existiert, möchte die Lösung sehen – adriaanp

+0

Sie können es über die Wayback Machine finden (http://replay.waybackmachine.org/20090301015011/http://code.google.com/p/ fluent-nhibernate/wiki/Beispiele), aber ich finde den relevanten Code nicht. – Peter

3

auf Datenbankebene wäre eine Lösung zu haben sein:

Val(Id) 
Bar(Id) 
BarToVal(IdBar, IdVal) 
FooToVal(IdFoo, IdVal) 

ich nicht ganz sicher bin, wie diese abgebildet werden würde. Vielleicht so etwas wie:

// BarMap: 
HasManyToMany(x => x.Vals).WithTableName("BarToVal"); 

// FooMap: 
HasManyToMany(x => x.Vals).WithTableName("FooToVal"); 

Hoffe, dass es Sinn macht ist ...

+0

Ja, ich würde es so machen, außer es ist ein bisschen ein Performance-Hit. Die Tabellen sind sehr klein (20 Bytes), und die PK ist alle Spalten (ForeignID, Field1, Field2) – MichaelGG