2010-12-15 7 views
1

J'ai ces classes:Courant NHibernate mapping

public class Entity 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string EntityName { get; set; } 
    public virtual IDictionary<string, Property> { get; set; } 
    // ... 
} 

public class Property 
{ 
    public virtual int? IntValue { get; set; } 
    public virtual decimal? DecimalValue { get; set; } 
} 

Est-il possible de créer des applications Fluent NHibernate afin que l'exécution du schéma résultant donnera à ces tables:

[Entities] 
* Id : UNIQUEIDENTIFIER NOT NULL 
* EntityName : NVARCHAR(50) NOT NULL 
with a clustered index on "Id" 

[Properties] 
* EntityId : UNIQUEIDENTIFIER NOT NULL 
* PropertyName : VARCHAR(50) NOT NULL 
* IntValue : INT NULL 
* DecimalValue : DECIMAL(12,6) NULL 
with a clustered index on "EntityId" and "PropertyName" 

Ou dois-je changer mes classes?

Une réponse plus détaillée que oui/non sera très appréciée :)

Répondre

1

En plus de votre index cluster que vous devez créer manuellement, oui. Avez-vous absolument besoin de FNH pour générer votre schéma? Pourquoi ne pas simplement générer le schéma vous-même en fonction de vos besoins et le mapper en conséquence?

(non testé ou quoi que ce soit, écrit sur le dessus de ma tête)

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Table("Entities"); 

     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name).CustomSqlType("NVARCHAR").Length(50).Not.Nullable(); 
     HasMany<Property>(x => x.Properties) 
      .Table("Properties") 
      .KeyColumn("PropertyName") 
      .Inverse() 
      .AsBag(); 
    } 
} 

public class PropertyMap : ClassMap<Property> 
{ 
    public PropertyMap() 
    { 
     Table("Properties"); 

     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.PropertyName).Length(50).Not.Nullable(); 
     Map(x => x.IntValue); 
     Map(x => x.DecimalValue); 
    } 
} 
+0

Je n'ai pas besoin de FNH pour générer le schéma, c'est juste un "agréable à avoir". A quoi ressembleraient les classes de mapping? –

+0

À la conjecture du sommet de ma tête, je pense qu'il serait mappé quelque chose comme dans mon édition de ma réponse. J'ai ajouté l'Id et PropertyName à la propriété pour l'insertion/mise à jour des propriétés. – Phill

+0

Merci, c'est vraiment proche de ce que j'ai trouvé jusqu'à présent. Je posterai aussi une réponse. –

0

Voici le mapping que je suis venu avec:

public sealed class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Table("Entities"); 

     Id(c => c.Id); 
     Map(c => c.EntityName).CustomSqlType("nvarchar(50)").Not.Nullable(); 

     HasMany(c => c.Properties) 
      .KeyColumn("EntityId") 
      .AsMap<string>("PropertyName") 
      .Component(part => 
      { 
       part.Map(x => x.IntValue); 
       part.Map(x => x.DecimalValue).Precision(12).Scale(6); 
      }); 
    } 
} 

rendements de génération de schéma ceci:

create table Entities (
    Id UNIQUEIDENTIFIER not null, 
    EntityName nvarchar(50) not null, 
    primary key (Id) 
) 

create table Properties (
    EntityId UNIQUEIDENTIFIER not null, 
    IntValue INT null, 
    DecimalValue DECIMAL(12, 6) null, 
    PropertyName INT not null, 
    primary key (EntityId, PropertyName) 
) 

alter table Properties 
    add constraint FK63646D8550C14DC4 
    foreign key (EntityId) 
    references Entities 

Ce qui est à peu près ce dont j'ai besoin, avec un ex Ception de l'ordre de la colonne (problème mineur) et PropertyName étant nvarchar(255) au lieu de varchar(50) (quelque chose dont je me soucie réellement).