0

Je crée une petite application en utilisant Sharp Architecture, et j'ai rencontré un bug que je n'arrive pas à comprendre. Je pense que cela a quelque chose à voir avec les mappages de NHibernte. Dans ma méthode HttpPost Create(), mon appel SaveOrUpdate essaie d'insérer null dans le champ de clé primaire de la table. La déclaration de la clé primaire dans mon modèle est public virtual int Id { get; protected set; }.SaveOrUpdate essaie d'insérer NULL dans le champ clé primaire

J'ai vérifié newSprint.Id et c'est zéro. Je pense que le problème est avec mes NHibernate Mappings, donc j'ai inclus tout cela ci-dessous.

est ici la configuration AutoMapping:

public class AutomappingConfiguration : DefaultAutomappingConfiguration 
    { 
     public override bool ShouldMap(System.Type type) 
     { 
      return type.GetInterfaces().Any(x => 
       x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEntityWithTypedId<>)); 
     } 

     public override bool ShouldMap(Member member) 
     { 
      return base.ShouldMap(member) && member.CanWrite; 
     } 

     public override bool AbstractClassIsLayerSupertype(System.Type type) 
     { 
      return type == typeof(EntityWithTypedId<>) || type == typeof(Entity); 
     } 

     public override bool IsId(Member member) 
     { 
      return member.Name == "Id"; 
     } 
    } 

Le générateur de modèle auto-persistance:

public class AutoPersistenceModelGenerator : IAutoPersistenceModelGenerator 
    { 
     public AutoPersistenceModel Generate() 
     { 
      var mappings = AutoMap.AssemblyOf<Sprint>(new AutomappingConfiguration()); 
      mappings.IgnoreBase<Entity>(); 
      mappings.IgnoreBase(typeof(EntityWithTypedId<>)); 
      mappings.Conventions.Setup(GetConventions()); 
      mappings.UseOverridesFromAssemblyOf<AutoPersistenceModelGenerator>(); 

      return mappings; 
     } 

     private static Action<IConventionFinder> GetConventions() 
     { 
      return c => 
        { 
         c.Add<PrimaryKeyConvention>(); 
         c.Add<CustomForeignKeyConvention>(); 
         c.Add<HasManyConvention>(); 
         c.Add<TableNameConvention>(); 
        }; 
     } 

Merci à l'avance pour toute aide quiconque peut offrir.

Édition Je me suis rendu compte que le problème était avec la convention de nom de table. Supprimer cela de la configuration AutoMapping a résolu le problème. J'ai supprimé le code superflue et ajouté le mappage TableNameConvention dans l'espoir que quelqu'un puisse expliquer précisément ce qui a causé ces problèmes.

public class TableNameConvention : IClassConvention 
{ 
    public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
    { 
     instance.Table(Inflector.Net.Inflector.Pluralize(instance.EntityType.Name)); 

    } 
} 
+0

avez-vous vérifié ce que sql est généré pour la colonne id? Où appliquez-vous le nom par défaut id? – cpoDesign

Répondre

0

Votre IdGenerator n'a probablement pas raison. Vous devez définir un générateur approprié pour votre PrimaryKey. Par exemple, Identité si vous utilisez SQL Server.

Je ne sais pas comment vous définissez cela avec votre configuration, pas très familier avec Fluent NH. Ma conjecture est PrimaryKeyConvention?

+0

Chose étrange, je déboguais un peu plus loin, et j'ai essayé de spécifier le générateur Id avec HiLo, Identity et Sequential. Lorsque j'ai spécifié l'un d'entre eux, l'erreur a disparu, mais maintenant rien n'est ajouté à la base de données. – Vish

+0

Ne pas rincer la session peut-être? ou ne pas commettre la transaction? –

+0

J'ai fait un peu plus de débogage et j'ai déterminé que le problème était avec ma convention de nom de table. Retrait qui a résolu le problème, ou plus précisément, l'a ignoré. Je vais devoir examiner davantage les conventions pour comprendre pourquoi cela est arrivé. – Vish

Questions connexes