1

J'essaie de "nettoyer" une structure de base de données mal conçue (au moins dans mon ORM).Mappage NHibernate fluide (un à un avec conditionnel)

La structure de la table est quelque chose comme ceci:

Table: Members 
memberID (int PK) 
username (varchar) 

Table: Addresses 
addressID (int PK) 
memberID (int, not set as a FK - awesome) 
firstName (varchar) 
lastName (varchar) 
addressLine1 (varchar) 
isBillingAddress (bit) 

Je crée 2 classes (entités), l'un pour un client et un pour une adresse.

public class Customer 
{ 
    public virtual int CustomerID { get; set; } 
    public virtual string FirstName 
    { 
     get { return BillingAddress.FirstName; } 
     set { BillingAddress.FirstName = value; } 
    } 
    public virtual string LastName 
    { 
     get { return BillingAddress.LastName; } 
     set { BillingAddress.LastName = value; } 
    } 
    public virtual Address BillingAddress { get; set; } 
    public virtual Address ShippingAddress { get; set; } 
} 

public class Address 
{ 
    public virtual Customer Customer { get; set; } 
    public virtual int AddressID { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string AddressLine1 { get; set; } 
    public virtual string AddressLine2 { get; set; } 
    public virtual string City { get; set; } 
    public virtual string State { get; set; } 
    public virtual string PostalCode { get; set; } 
} 

La requête pour obtenir une adresse de facturation clients serait la suivante:

SELECT TOP 1 * 
FROM dbo.Address 
WHERE isBilling = 1 
AND memberID = @memberID 

Il devrait seulement 1 adresse de facturation et d'expédition par client. Jusqu'à présent, mon classmap couramment ressemble à ceci:

public class CustomerMapping : ClassMap<Customer> 
{ 
    public CustomerMapping() 
    { 
     Table("Members"); 

     Id(m => m.CustomerID).Column("memberID"); 
     Map(m => m.BillingAddress); 

     HasOne(x => x.BillingAddress).PropertyRef("memberID"); 
     HasOne(x => x.ShippingAddress).PropertyRef("memberID"); 
    } 
} 

Je ne sais pas si je devrais être même de hasOne ... il devrait être un pour un mappage. Comment puis-je obtenir la clause "où" (I.E. WHERE Address.memberID = Members.customerID) pour faire la distinction entre la facturation et l'expédition? Aussi, qu'en est-il du top 1? Je sais que je peux peut-être utiliser Join mais je ne vois pas de fonction fluide pour ajouter la clause where.

La modification de la structure de la base de données n'est malheureusement pas une option.

Merci

Répondre

1

Vous ne voulez pas un hasOne(), mais il sonne juste. HasOne() signifie que les tables partagent des clés primaires. Utilisez plutôt References().

+0

Merci, je vais l'utiliser à la place ... cependant, sans pouvoir référencer les adresses de manière conditionnelle, cela ne me sert à rien –

+0

Que voulez-vous dire par "référencer sous condition les adresses"? Je ne comprends pas. –

+0

Les adresses de facturation et d'expédition sont stockées dans la même table et je souhaite utiliser différentes classes dans mon ORM pour les représenter. Pour ce faire, j'ai besoin d'avoir la jointure de référence basée sur le champ de bits IsBilling. –

Questions connexes