2010-01-14 9 views
3

Je suis en train d'adapter Fluent NHibernate à notre application existante existante et j'essaie de déterminer comment utiliser ClassMap et SubclassMap pour la hiérarchie d'entités montrée.Fluent Nhibernate Comment spécifier Id() dans SubclassMap

// BaseObject contains database columns common to every table 
public class BaseObject 
{ 
    // does NOT contain database id column 
    public string CommonDbCol1 { get; set; } 
    public string CommonDbCol2 { get; set; } 
    // ... 
} 

public class Entity1 : BaseObject 
{ 
    public int Entity1Id { get; set; } 
    // other Entity1 properties 
} 

public class Entity2 : BaseObject 
{ 
    public int Entity2Id { get; set; } 
    // other Entity2 properties 
} 

Les colonnes d'identité pour Entity1 et Entity2 sont nommées de façon unique par table. BaseObject contient des colonnes communes à toutes nos entités. Je n'utilise pas AutoMapping, et je pensais que je pouvais utiliser ClassMap sur le BaseObject, puis utilisez SubclassMap sur chaque entité comme ceci:

public class Entity1Map : SubclassMap<Entity1> 
{ 
    public Entity1Map() 
    { 
     Id(x => x.Entity1Id); 
     // ... 
    } 
} 

Le problème est, Id() n'est pas défini pour SubclassMap. Alors, comment est-ce que je spécifie dans chaque Entity1Map, Entity2Map, ... (nous avons plus de 100 classes d'entités héritant de BaseObject) ce qu'est l'Id spécifique à l'entité?

Merci d'avance pour toute idée!

Répondre

8

Il n'est pas possible de le faire avec Fluent NHibernate ou NHibernate. Voulez-vous réellement que vos classes soient mappées en sous-classes, ou voulez-vous simplement qu'elles partagent les mappages communs? Si vous voulez vraiment des sous-classes, alors vous aurez besoin de les faire partager la colonne d'identité, pas d'autre solution; Si vous ne voulez pas de sous-classes réelles, créez un résumé ClassMap<T> where T : BaseObject et mappez les propriétés communes.

Quelque chose comme:

public abstract class BaseObjectMap<T> : ClassMap<T> where T : BaseObject 
{ 
    public BaseObjectMap() 
    { 
    Map(x => x.CommonProperty1); 
    } 
} 
+0

Je vois maintenant la distinction et la BaseObjectMap classe abstraite est exactement ce que je suis après. Parfait. Merci beaucoup! – kenswdev

+0

+1 Bonne réponse! –

+0

Bonne réponse. Voilà comment je m'attendais à utiliser des sous-classes pour travailler en premier lieu. Merci pour la solution réfléchie. –

Questions connexes