0

J'ai un proglem avec nhibernate courant avec C# + MVC. Cela ne rend pas id unique.J'ai un proglème avec nhibernate courant avec C# + MVC. Il ne rend pas unique id

Je cours mon application. Ajouter un post. Son identifiant est 1.

J'ai arrêté mon application. Ensuite, je l'exécute à nouveau et si je crée un nouvel enregistrement, il est généré l'ID 1 pour un autre poste et l'écris sur le précédent.

public class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    public virtual string ShortDescription { get; set; } 
    ...  
} 

Mapping

public class PostMap : ClassMap<Post> 
{ 
    public PostMap() 
    { 
     Id(x => x.Id);    

     Map(x => x.Title) 
      .Length(500); 
     ... 

Aide

public class NHibernateHelper 
{ 
    private static ISessionFactory _sessionFactory; 

    private static ISessionFactory SessionFactory 
    { 
     get 
     { 
      if (_sessionFactory == null) 

       InitializeSessionFactory(); 
      return _sessionFactory; 
     } 
    } 


    private static void InitializeSessionFactory() 
    { 
     _sessionFactory = Fluently.Configure() 
        .Database(MsSqlConfiguration.MsSql2012 
        .ConnectionString(c => c.FromConnectionStringWithKey("DefaultConnection")))     
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Post>()) 
        .ExposeConfiguration(cfg => new SchemaExport(cfg) 
              .Create(true, true)) 
      .BuildSessionFactory();    
    } 


    public static ISession OpenSession() 
    { 
     return SessionFactory.OpenSession(); 
    } 
}  

Blog dépôt

public class BlogRepository 
{ 
    public int AddPost(Post post) 
    { 
     using (var session = NHibernateHelper.OpenSession()) 
     { 
      using (var tran = session.BeginTransaction()) 
      { 
       session.Save(post); 
       tran.Commit(); 
       return post.Id; 
      } 
     } 
    } 

extrait de code:

var _blogRepository = new BlogRepository(); 
var post = new Post(); 
post.Title = "Form den3"; 
post.PostedOn = DateTime.Now; 
post.Modified = DateTime.Now; 
var postID = _blogRepository.AddPost(post); 
+0

Tout code que vous pouvez partager? –

+0

Cela fait un certain temps que j'ai utilisé nHibernate, mais ne devez-vous pas spécifier qu'il s'agit d'une colonne d'identité générée par db dans la carte de classe? Donc 'Id (x => x.Id) .GeneratedBy.Identity()' – christophano

+0

J'ai essayé Id (x => x.Id) .GeneratedBy.Identity() mais la situation est toujours la même ( –

Répondre

1

Mappage tel quel, devrait être ok et devrait utiliser Identity(la valeur par défaut). Et cette ligne:

Id(x => x.Id).GeneratedBy.Identity() 

doit garantir que l'identité est utilisée. Mais comme dit dans les commentaires, ça ne marche pas non plus.

Le plus soupçonné pour moi est ce morceau de code:

new SchemaExport(cfg).Create(true, true)) 

Cela fait DROPS les tables et les recréer. Ce qui pourrait se retrouver dans « régénéré » id == 1.

Alors, essayez de ne pas utiliser que, si on utilise vraiment besoin juste .Update()