2010-03-29 4 views
3
My Entity Class: 
public class Building 
    { 
     /// <summary> 
     /// internal Id 
     /// </summary> 
     public virtual long Id { get; set; } 
.............. 
} 

Mon Mapping:AutoMapping ne dispose pas d'un Id cartographié

var model = AutoMap.AssemblyOf<Building>() 
         .Setup(s => s.FindIdentity = p => p.Name == "Id") 
         .Where(t => t.Namespace == "SpikeAutoMappings"); 

var database = Fluently.Configure() 
         .Database(DatabaseConfigurer) 
         .Mappings(m=>m.AutoMappings.Add(model)); 

je besoin de quelqu'un pour me aider à voir ce qui est faux parce que je continue à avoir cette erreur lors de lancer le test de:

Initialization method TestProject1.MappingTestBase.TestInitialize threw exception. FluentNHibernate.Cfg.FluentConfigurationException: FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 

---> FluentNHibernate.Visitors.ValidationException: The entity doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id).. 

Répondre

0

Mon expérience avec Automapping est que tant que votre classe Entité a la ligne:

public virtual int Id { get; private set; } 

l'automapper le traitera comme une identification sans autre aide du programmeur (c.-à-d. pas besoin du code FindIdenity que vous utilisez dans votre appel AutoMap).

La seule différence que je vois dans votre déclaration d'ID est que vous utilisez un type long au lieu de int. Je ne sais pas si cela compte ou non.

+1

Thx Tom. Suis Oracle 10g et Id est un type long. Essayé votre ligne et a sorti la configuration FindIdentity ... toujours eu la même erreur .... – Gini

1

Généralement, l'utilisation de AutoMapping est une mauvaise politique car le fichier Id doit exister dans vos tables de base de données. Au lieu de cela, pensez à utiliser un générateur de mappage fluide, tel que NMG pour gérer votre mappage.

Dans ce cas, vous souhaiterez d'abord télécharger/installer l'application, puis générer les fichiers de mappage à partir de votre base de données (Oracle, SQL et divers autres). Pour créer les fichiers de mappage, commencez par créer un dossier /Entities/ dans votre projet. Ensuite, configurer le logiciel générateur comme suit:

Préférences

  1. Generated Nom de = Identique au nom de la colonne de base de données (pas de changement)
  2. Mapping style = Cartographie Courant
  3. Champ ou propriété = Propriété auto

Langues disponibles: C# et VB

  1. Dossier: [your project folder]\Entities
  2. Espace de noms: [your project namespace].Entities
  3. Nom Assemblée: [your project name].Entities

Ensuite, soit Générer tout ou Générer le tableau spécifique. Tous les fichiers *.cs et *Map.cs doivent maintenant être créés dans votre projet (vous pouvez les ajouter avec Add Existing Item... s'ils n'apparaissent pas).

En utilisant Fluent, vous verrez quelque chose comme ce qui suit:

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Sequence("keyname_ID") 

ou

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Identity() 
    .Column("keyname_ID") 

ou

Id(x => x.keyName_ID) 
    .Column(x => x.keyname_ID) 
    .GeneratedBy 
    .Assigned() 

Donc, maintenant nous avons besoin de spécifier le Id en utilisant FluentMapping avec Fluent nHibernate. Pour ce faire, vous devez remplacer la ligne de code Id dans chacun des fichiers Map de la solution. Il suffit d'ajouter:

Id(x => x.KeyName_ID) 
    .GeneratedBy 
    .GetGeneratorMapping() 
    .IsSpecified("KeyName_ID"); 

keyname_id est le nom de la colonne de la id dans votre base de données, plutôt que celui créé.

Notez que dans votre correspondance au BuildSession vous devez avoir:

(...).Mappings(m => 
    m.FluentMappings.AddFromAssemblyOf<[one of your entities]>() 
); 

Et maintenant Id est mis en correspondance. :) J'espère que ça aide!

9

les deux réponses ci-dessus sont exactes; sauf si vous spécifiez différemment, l'automapper suppose que vous avez un champ int id.
Si votre ID est long, l'automapper peut ne pas le reconnaître correctement.
essayer de définir un MappingOverride pour votre classe (es), comme ceci: la fonction

public class UserMappingOverride : IAutoMappingOverride<User> 
{ 
    #region IAutoMappingOverride<User> Members 

    public void Override(AutoMapping<User> mapping) 
    { 
     mapping.Id(u => u.Name); 
    } 

    #endregion 
} 

Id() vous permet de remplacer la convention du automapper de ce que le champ ID devrait être. Pour plus d'informations sur l'annulation, voir http://wiki.fluentnhibernate.org/Auto_mapping#Overrides.
Cheers,
Jhonny

Questions connexes