2011-01-12 2 views
1

J'ai une base de données assez simple:cartographie complexe des colonnes et des tables dans NHibernate

Table namedItem
Colonnes:
Id (PK)
Pays (string)
Catégorie (string)
MainName (string)

tableau AlternateNames

Colonnes: NamedItemId (FK) à NamedItem.Id
AlternateName (string)

Je veux avoir les classes et énumérations suivantes à la carte à ces deux tables:

ENUM Pays {Allemagne, Angleterre, Espagne} // Nom de la valeur ENUM et chaîne de pays DB doivent être les mêmes
enum Catégorie {A, B, C} // Le nom de la valeur d'énumération et la chaîne de catégorie dans la base de données doivent être les mêmes
class Item {Guid ID {get; set;} ItemNames Noms { get; set;}}
class ItemNames {string Nom principal {get; set;} IList <chaîne> Noms alternés {get; ensemble;}}

MISE À JOUR:
L'important ne sont pas les énumérations mais que la classe de noms d'éléments qui contient des pièces de deux tables différentes et se trouve dans l'entité de l'une de ces tables. Est-ce possible avec NHibernate, de préférence avec NHibernate Fluent?

Est-ce possible avec NHibernate?
Si oui, s'il vous plaît donnez-moi un bon départ. Je ne pouvais pas comprendre, comment le faire.

Cordialement,

Daniel

post-scriptum J'ai posté la même question dans le forum Microsoft Entity Framework, demandant si c'est possible avec EF4. Selon les réponses, je choisirai le cadre que j'utiliserai. Au cas où quelqu'un se demanderait ...

+0

Il peut être fait tranquillement facilement. Je le fais tout le temps car MySQL prend en charge un type de données enum. Quoi qu'il en soit, je vais poster un peu de code de mappage fluide un peu plus tard aujourd'hui pour vous. – cdmdotnet

Répondre

1

Mappez simplement la classe comme s'il s'agissait d'un type de données de chaîne normal. NH appellera la méthode ToString de la valeur en sauvegardant la valeur textuelle de l'énumération dans la base de données.

de sorte que vous liste pourrait ressembler à:

public partial class ItemMap : ClassMap<Item> 
{ 
    Table("NamedItem") ; 
    Id(x => x.Id, "Id") 
     .Not.Nullable() 
     .GeneratedBy.Guid(); 

    Map(x => x.Country) 
     .Column("Country") 
     .Not.Nullable() 
     .Length(255) ; 

    Map(x => x.Category) 
     .Column("Category") 
     .Not.Nullable() 
     .Length(255) ; 
    ... 

    HasMany<ItemName>(x => x.ItemNames) 
     .KeyColumns.Add("NamedItemId") 
     .Table("AlternateNames") 
     .LazyLoad() 
     .Cascade.None() 
     .AsSet() ; 
    ... 
} 

et une classe semblable à

public class Item 
{ 
    public virtual Guid Id { get; set; } 
    public virtual CountryType Country { get; set; } 
    public virtual CategoryType Category { get; set; } 
    ... 
    public virtual ISet<ItemNames> AlternateNames {get; set;} 
    ... 
} 

J'ai la collection vers un ensemble comme qui arrête les doublons étant dans la collection qui peut parfois causer des problèmes.

+0

Salut cdmdotnet, merci pour votre réponse! Malheureusement, il semble que je n'ai pas été suffisamment précis sur mon problème: le problème n'est pas avec les énumérations mais avec la classe ItemNames.Notez que dans ma classe Item il n'y a pas de liste de noms alternatifs et pas de nom principal, mais ceux-ci sont dans cette sous-classe. En outre, AlteranateNames est une liste de chaîne. Pas de type d'entité "spécial" ... J'ai mis à jour ma question. –

Questions connexes