-1

Wie ordne ich diese vorhandenen Tabellen den folgenden Klassen zu?Wie können Sie Eltern-Kind-Tabellen in Klassen mit Fluent NHibernate reduzieren?

Ich habe die folgenden Tabellen:

CREATE TABLE dbo.UserContact (
    UserContactId int NOT NULL IDENTITY (1, 1), 
    UserId int NOT NULL, 
    ContactId int NOT NULL, 
    UserContactTypeId int NOT NULL, 
    FromDt datetime NULL, 
    ThruDt datetime NULL, 
    CreateDt datetime NOT NULL, 
    UpdateDt datetime NULL, 
    IsDeleted bit NULL, 
    CanSolicit bit NOT NULL 
) 

CREATE TABLE dbo.Contact (
    ContactId int NOT NULL IDENTITY (1, 1), 
    CreateDt datetime NOT NULL, 
    UpdateDt datetime NULL 
) 

CREATE TABLE dbo.Electronic (
    ContactId int NOT NULL, 
    URL nvarchar(512) NOT NULL, 
    ElectronicType smallint NULL 
) 

CREATE TABLE dbo.Phone (
    ContactId int NOT NULL, 
    AreaCode nchar(3) NOT NULL, 
    PhoneNb nchar(7) NOT NULL, 
    Extension nchar(6) NULL, 
    PhoneType smallint NULL 
) 

CREATE TABLE dbo.Postal 
(
    ContactId int NOT NULL, 
    Street nvarchar(256) NOT NULL, 
    Specifier nvarchar(256) NULL, 
    GeocodeId int NULL 
) 

Die Tabellen Electronic, Telefon und Post sind in einer Eins-zu-Eins-Beziehung mit Kontakt. Die Tabelle UserContact befindet sich in einer Viele-zu-Eins-Beziehung mit Contact. UserContact ist eine Zuordnungstabelle zwischen Benutzer und Kontakt.

Ich habe auch die folgenden Klassen:

public class Electronic : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string Url { get; set; } 
    public ElectronicType Type { get; set; } 
} 

public class Postal : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string Street { get; set; } 
    public string Specifier { get; set; } 
    public Geocode Geocode { get; set; } 
} 

public class Phone : IntegerKeyEntity 
{ 
    public virtual ContactId { get; set; } 
    public virtual DateTime CreateDt { get; set; } 
    public virtual DateTime? UpdateDt { get; set; } 
    public string AreaCode { get; set; } 
    public string PhoneNb { get; set; } 
    public string Extension { get; set; } 
    public PhoneType Type { get; set; } 
} 

public class UserContact : IntegerKeyEntity 
{ 
    private ICollection<Electronic> electronics = new HashSet<Electronic>(); 
    private ICollection<Phone> phones = new HashSet<Phone>(); 
    private ICollection<Postal> postals = new HashSet<Postal>(); 

    // props 

    public virtual IEnumerable<Electronic> Electronics { get { return electronics; } } 
    public virtual IEnumerable<Phone> Phones { get { return phones; } } 
    public virtual IEnumerable<Postal> Postals { get { return postals; } } 
} 

Also, ich mich von den vier Kontakttabellen (Eltern und Kind) erhalte bis zu den drei Klassen? Und wie ordne ich diese drei Klassen der UserContact-Tabelle zu. Ich gehe davon aus, dass ich drei ILists haben kann, einen für jede Klasse.

Antwort

1

Ich denke, dass Sie dies falsch modellieren. Es scheint mir, dass Electronic, Phone und Post den Kontakt erweitern (erben von) und dies sollte in Ihrem Domänenmodell ausgedrückt werden. Diese Klassen stehen nicht in direktem Kontakt zu Contact, sie sind konkrete Typen, die den abstrakten Contact-Typ erweitern. Wenn Sie es auf diese Weise modellieren, können Sie Kontakt mit table-per-subclass inheritance mapping zuordnen.

Der Benutzer hat dann eine Viele-zu-Viele-Beziehung mit Contact, und die Contacts-Sammlung des Benutzers enthält Kontakte aller Art.

Persönlich würde ich alle Kontakttypen in eine Tabelle legen und die einfachere Tabelle-pro-Klasse-Zuordnung verwenden.

+0

Korrekt. Die drei untergeordneten Tabellen erweitern die übergeordnete Kontakttabelle in der Datenbank. Ich glaube, ich versuchte, die mittlere Ebene einfach zu halten, indem ich die Kontakttabelle unsichtbar machte und die untergeordneten Klassen zu unabhängigen Klassen machte. Ich kann zurückgehen und tun, was Sie vorschlagen, aber vorausgesetzt, ich ändere meine Meinung nicht, ist das obige möglich? Wenn das so ist, wie? – alphadogg

+0

Was Sie vorhaben zu tun, ist viel komplizierter als die Verwendung der Vererbung, besonders wenn Sie eine Tabelle-für-Klasse-Zuordnung verwenden. Bei Vererbung wäre die Kontakttabelle außer in Ihrem Mapping weiterhin unsichtbar. Wenn Sie Ihre Meinung nicht ändern, würde ich vorschlagen, Ansichten für die drei Kontakttypen zu verwenden. –

+0

Ich habe es so gemacht, wie du es empfohlen hast, wo ich zuerst hinging. Wir werden sehen, ob ich es ändern muss. Keine Notwendigkeit, Dinge früh zu erschweren. – alphadogg