-1

Comment mapper ces tables existantes aux classes ci-dessous?Comment faire pour réduire les tables parent-enfant un-à-un dans les classes avec Fluent NHibernate?

J'ai les tableaux suivants:

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 
) 

Les tables électroniques, téléphoniques et postales sont une à une relation avec contact. La table UserContact est dans un plusieurs-à-un avec Contact; UserContact est une table d'association entre Utilisateur et Contact.

J'ai aussi les classes suivantes:

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; } } 
} 

Alors, je puis-je obtenir des quatre tables de contact (parents et enfants) vers le bas aux trois classes? Et comment mapper ces trois classes à la table UserContact. Je suppose que je peux avoir trois ILists, un pour chaque classe.

Répondre

1

Je pense que vous ne modélisez pas correctement. Il me semble que Electronic, Phone, et Postal étendent (héritent de) Contact et cela devrait être exprimé dans votre modèle de domaine. Ces classes ne sont pas liées à Contact par un à un, ce sont des types concrets qui étendent le type de contact abstrait. Si vous le modélisez de cette façon, vous pouvez mapper Contact en utilisant table-per-subclass inheritance mapping. L'utilisateur aurait alors une relation plusieurs-à-plusieurs avec Contact, et la collection Contacts de l'utilisateur contiendrait des contacts de n'importe quel type.

Personnellement, je mettrais tous les types de contact dans une table et utiliserais le mappage table par classe plus simple.

+0

Correct. Les trois tables enfant étendent la table Contact parent dans la base de données. Je suppose que j'essayais de garder la couche intermédiaire simple en rendant la table Contact invisible et en rendant les classes indépendantes des enfants. Je peux revenir en arrière et faire ce que vous suggérez, mais en supposant que je ne change pas d'avis, cela est-il possible? Si c'est le cas, comment? – alphadogg

+0

Ce que vous avez l'intention de faire est beaucoup plus compliqué que l'utilisation de l'héritage, surtout si vous utilisez un mappage table par classe. Avec l'héritage la table de contact serait toujours invisible sauf dans votre mapping. Si vous ne changez pas d'avis, je vous suggère d'utiliser des vues pour les trois types de contact. –

+0

Je l'ai fait comme vous le recommandiez, et c'est là que j'allais en premier. Nous verrons si j'ai besoin de le changer. Pas besoin de compliquer les choses tôt. – alphadogg