Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 23
  1. #1
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut [FluentNhibernate] et configuration base de données

    Bonjour
    j ai le code suivant de la creation d une sessionfactory
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private static ISessionFactory CreateSessionFactory()
            {
                return Fluently.Configure()
          .Database(MsSqlConfiguration.MsSql2008
          .ConnectionString(m => m.Server(@".\SqlExpress")
              .Database("company")
              .TrustedConnection()))
          .Mappings(m => m
        .FluentMappings.AddFromAssemblyOf<??????????>())
      .BuildSessionFactory();
          .ExposeConfiguration((Configuration config) => new SchemaExport(config).Create(false, true))
          .BuildSessionFactory();
     
              }
    j'ai beau essayé de mettre les noms des entités dans la partie ou il y a des ??? mais y a tjrs une erreur.
    merci

  2. #2
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Citation Envoyé par hellalaboy Voir le message
    j'ai beau essayé de mettre les noms des entités dans la partie ou il y a des ??? mais y a tjrs une erreur.
    QUELLE erreur ? on est pas devins...

    dis ce que tu as essayé et ce que tu as obtenu comme erreur

  3. #3
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Apres plusieurs essai,voici le code sur lequel je me suis basé
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private static ISessionFactory CreateSessionFactory()
            {
                return Fluently.Configure()
               .Database(MsSqlConfiguration.MsSql2005
               .ConnectionString(c => c
               .Server("(local)\\SQLEXPRESS")
               .Database("company")
               .Username("simo")
               .Password("mp")))
               .Mappings(m => m
               .FluentMappings.AddFromAssemblyOf<Program>())
               .BuildSessionFactory();
     
     
              }
    l'exception qui se déclenche est:
    An unhandled exception of type 'FluentNHibernate.Cfg.FluentConfigurationException' occurred in FluentNHibernate.dll

    Additional information: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.


    + Thrown: "Could not load file or assembly 'NHibernate.XmlSerializers, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. Le fichier spécifié est introuvable." (System.IO.FileNotFoundException) Exception Message = "Could not load file or assembly 'NHibernate.XmlSerializers, Version=3.1.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4' or one of its dependencies. Le fichier spécifié est introuvable.", Exception Type = "System.IO.FileNotFoundException"

  4. #4
    Modérateur
    Avatar de Er3van
    Homme Profil pro Clément Lehalle
    Architecte Logiciel
    Inscrit en
    avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Nom : Homme Clément Lehalle
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2008
    Messages : 1 430
    Points : 2 161
    Points
    2 161

    Par défaut

    Ta dll "NHibernate.XmlSerializers" est-elle correctement référencée dans ton projet ?
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  5. #5
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    En fait voici les 3 dll auquelles j ai ajouté une référence:

    FluentNHibernate.dll

    NHibernate.dll

    NHibernate.ByteCode.Castle.dll

    quand j au telechargé fluent nhibernate ,je n ai pas trouvé de dll pour XMLserializers

  6. #6
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Il me semble avoir déjà vu cette erreur, mais normalement c'est juste une "first-chance exception" qui est interceptée en interne par NHibernate, elle ne devrait pas planter ton programme

    (En fait, c'est le moteur de sérialisation XML qui regarde s'il y a des sérialiseurs déjà générés, et pour ça il regarde si l'assembly NHibernate.XmlSerializers existe. S'il existe pas ça le génère automatiquement...)

    Tu es sûr que c'est bien cette exception-là qui fait planter ? Mets un try/catch autour de l'instruction qui pose problème, et regarde l'exception générée

  7. #7
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Bonjour
    vous avez raison,c’était plutôt une deuxième exception concernant l'authentification qui arrêter l’exécution.
    Je savais pas le user et mot de passe adequat pour l'authentification et je les ai changé par un un .TrustedConnection()))
    voici le bout de code qui marche bien pour la création d'une session:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private static ISessionFactory CreateSessionFactory()
            {
                return Fluently.Configure()
               .Database(MsSqlConfiguration.MsSql2005
               .ConnectionString(c => c
               .Server("(local)\\SQLEXPRESS")
               .Database("company")
               .TrustedConnection()))
               //.Username("hcp\\simo")
               //.Password("")))
               .Mappings(m => m
               .FluentMappings.AddFromAssemblyOf<Program>())
               .BuildSessionFactory();
     
     
              }
    L'execution marche tres bien jusqu'a le processus d'insertion dans la base ou j ai :

    could not insert: [FirstProject.Entities.Store][SQL: INSERT INTO [Store] (Name) VALUES (?); select SCOPE_IDENTITY()]

  8. #8
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    voici le code de la classe store:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace FirstProject.Entities
    {
        public class Store
        {
            private int id;
            private string name;
            private IList<Product> products;
            private IList<Employee> staff;
            public virtual int Id
            {
                get { return id; }
                set { id = value; }
            }
            public virtual string Name
            {
                get { return name; }
                set { name = value; }
            }
     
            // list of product that are stored in the store
            public virtual IList<Product> Products
            {
                get { return products; }
                set { products = value; }
            }
            //list of employe that work in the store
            public virtual IList<Employee> Staff
            {
                get { return staff; }
                set { staff = value; }
            }
            public Store() 
            {
                Products = new List<Product>();
                Staff = new List<Employee>();
            }
            public virtual void AddProduct(Product product)
            {
                // ajouter le magasin a la liste magasin qui ont ce produit
                product.StoresStockedIn.Add(this);
                // ajouter produit a une liste de produit
                products.Add(product);
            }
            public virtual  void AddEmployee(Employee employee)
            {
                employee.Store_id = this;
                Staff.Add(employee);
            }
        }
    }

  9. #9
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Citation Envoyé par hellalaboy Voir le message
    L'execution marche tres bien jusqu'a le processus d'insertion dans la base ou j ai :

    could not insert: [FirstProject.Entities.Store][SQL: INSERT INTO [Store] (Name) VALUES (?); select SCOPE_IDENTITY()]
    Quelle est l'exception interne (InnerException) ?

  10. #10
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Generic Ado Exception est déclenché

    could not insert: [FirstProject.Entities.Store][SQL: INSERT INTO [Store] (Name) VALUES (?); select SCOPE_IDENTITY()]

  11. #11
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Ca c'est pas la InnerException, c'est la même que tu avais déjà postée... poste toutes les InnerExceptions, normalement ça doit te donner plus de détails

  12. #12
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Bonjour

    J'ai pas compris ce que vous voulez dire par poster toutes les Innerexceptions?
    Pouvez vous être plus explicite

  13. #13
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Chaque exception X a une propriété de InnerException, qui peut contenir une exception Y qui est la cause de X. Mais Y étant aussi une exception, elle a aussi une propriété InnerException, qui peut contenir une exception Z qui est la cause de Y. Et ainsi de suite, jusqu'à ce que InnerException ne contienne rien du tout (null)
    Ce que je te demande, c'est toutes ces exceptions X, Y, Z etc

    Exemple (fictif) :
    Exception : impossible d'insérer un objet en base.
    Pourquoi ? => InnerException : erreur d'exécution de la requête SQL
    Pourquoi ? => InnerException : la clé existe déjà

  14. #14
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Merci pour l'explication:

    ADO.net:Execute Reader "INSERT INTO [Store] (Name) VALUES (@p0); select SCOPE_IDENTITY()" Command Text = "INSERT INTO [Store] (Name) VALUES (@p0); select SCOPE_IDENTITY()", Connection String = "Data Source=P-ELECTIONS-32\\SQLEXPRESS;Initial Catalog=company;Integrated Security=True"


    Exception: Thrown: "Cannot insert the value NULL into column 'Id', table 'company.dbo.Store'; column does not allow nulls. INSERT fails.
    The statement has been terminated." (System.Data.SqlClient.SqlException) Exception Message = "Cannot insert the value NULL into column 'Id', table 'company.dbo.Store'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.", Exception Type = "System.Data.SqlClient.SqlException"
    merci

  15. #15
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    l'exception se declenche lors de la sauggarde de la session
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    class Program
        {
            static void Main(string[] args)
            {
                var sessionFactory = CreateSessionFactory();
                using (var session = sessionFactory.OpenSession())
                {
                    using (var transaction = session.BeginTransaction())
                    {
                         // create a couple of stores each with some products and employee
                        var barginBasin=new Store{Name="Bargin_Basin"};
                        //var superMart = new Store { Name = "super Mart" };
     
                        var potatoes = new Product { Name = "Potatoes", Price = 3.60 };
                        var fish = new Product { Name = "Fish", Price = 4.49 };
                        var milk = new Product { Name = "Milk", Price = 0.79 };
                        var bread = new Product { Name = "Bread", Price = 1.29 };
                        var cheese = new Product { Name = "Cheese", Price = 2.10 };
                        var waffles = new Product { Name = "Waffles", Price = 2.41 };
     
                        var daisy = new Employee { FirstName = "Daisy", LastName = "Harrison" };
                        var jack = new Employee { FirstName = "Jack", LastName = "Torrance" };
                        var sue = new Employee { FirstName = "Sue", LastName = "Walkters" };
                        var bill = new Employee { FirstName = "Bill", LastName = "Taft" };
                        var joan = new Employee { FirstName = "Joan", LastName = "Pope" };
     
                        // add products to the stores, there's some crossover in the products in each
                        // store, because the store-product relationship is many-to-many
                        AddProductsToStore(barginBasin, potatoes, fish, milk, bread, cheese);
                        //AddProductsToStore(superMart, bread, cheese, waffles);
     
                        // add employees to the stores, this relationship is a one-to-many, so one
                        // employee can only work at one store at a time
                        AddEmployeesToStore(barginBasin, daisy, jack, sue);
                        //AddEmployeesToStore(superMart, bill, joan);
     
                        // save both stores, this saves everything else via cascading
                        session.SaveOrUpdate(barginBasin);
                        //session.SaveOrUpdate(superMart);
     
                        transaction.Commit();
                    }
                }
     
     
            }

    ça se fait au niveau de
    Code :
    session.SaveOrUpdate(barginBasin);

  16. #16
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Apparemment tu as du indiquer dans ton mapping que l'id était auto-généré par la base, mais en fait ce n'est pas le cas. Donc il faut soit donner explicitement une valeur à l'id, soit modifier le schéma de la BDD pour que la colonne Id soit une colonne identité.

    Montre la définition de la colonne Id dans la base, et le mapping de la classe Product

    EDIT: ok, j'avais pas réalisé que tu avais suivi le tuto sur le site de FluentNH...
    Apparemment par défaut le générateur est "identity", mais si la colonne en base n'est pas une colonne identité ça marche pas...

    Il doit y avoir un truc pour indiquer comment la valeur de l'Id est générée, par exemple quelque chose dans ce style

    Code :
    Id(x => x.Id).GeneratedBy.Increment();
    Je peux pas vérifier si c'est ça, j'ai pas FluentNH sous la main, et il n'y a pas de doc de référence de l'API (pas plus que pour NH... c'est vraiment abusé que des projets aussi importants ne se donnent pas la peine de documenter l'API )

  17. #17
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    Je n'ai pas indiqué que l'ID est autogeneré par la base:
    voici la definition d'id dans la base
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE TABLE [dbo].[Store](
    	[Id] [int] NOT NULL,
    	[Name] [nvarchar](50) NULL,
     CONSTRAINT [PK_Store] PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
     
    GO
     
    ALTER TABLE [dbo].[Store]  WITH CHECK ADD  CONSTRAINT [FK_Store_Store] FOREIGN KEY([Id])
    REFERENCES [dbo].[Store] ([Id])
    GO
     
    ALTER TABLE [dbo].[Store] CHECK CONSTRAINT [FK_Store_Store]
    GO
    et voici le mapping de la classe store:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class StoreMap:ClassMap<Store>
        {
            public StoreMap()
            {
                Id(x => x.Id);
                Map(x => x.Name);
                HasMany(x => x.Staff)
                    .Inverse()
                    .Cascade.All();
                HasManyToMany(x => x.Products)
                    .Cascade.All()
                    .Table("StoreProduct");
     
            }
        }
    Ce que j ai pu comprendre est que Nhibernate est celui qui a le droit de donner une valeur a L'id.Je l ai lu sur une doc sur internet:
    There's two things that may stand out to you if you're unfamiliar with NHibernate. Firstly, the Id property has a private setter, this is because it's only NHibernate that should be setting the value of that Id. Secondly, all the properties are marked virtual; this is because NHibernate creates "proxies" of your entities at run time to allow for lazy loading, and for it to do that it needs to be able to override the properties.
    http://wiki.fluentnhibernate.org/Getting_started

  18. #18
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    J'ai édité ma réponse entre temps, mais à cause de problèmes de connexion j'ai pas pu la poster avant que tu répondes... regarde mon message précédent, ça répondra peut-être à ta question

  19. #19
    Membre à l'essai
    Inscrit en
    juillet 2009
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : juillet 2009
    Messages : 98
    Points : 22
    Points
    22

    Par défaut

    D'apres ce qu'il y a dans le tuto sur le site de FluentNH...
    quand fluentNh voit que L ID est int alors automatiquement il le mappe comme une identité autoincrem.Or c est pas le cas ici,car j ai forcé l'identité comme vous m aviez dit:
    Code :
    Id(x => x.Id).GeneratedBy.Increment();
    ça permet de dépasser le problème d'identité.Mais j ai constaté que il faut faire l identité directement dans la BD car une autre exception se declenche:
    Exception Message "Cannot insert explicit value for identity column in table 'Employee' when IDENTITY_INSERT is set to OFF." string
    je pense que cette exception est du au fait que sur la base de donnée,Il n y a pas d'identité déclaré.

    Comme vous aviez dit
    c'est vraiment abusé que des projets aussi importants ne se donnent pas la peine de documenter l'API
    J'ai longtemps cherché avant d'opter pour fluent car il me semble que c est le plus documenté

  20. #20
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 169
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 169
    Points : 36 583
    Points
    36 583

    Par défaut

    Citation Envoyé par hellalaboy Voir le message
    il me semble que c est le plus documenté
    Perso, un petit wiki avec 4 ou 5 articles de type tutoriel, c'est pas ce que j'appelle une "documentation"... Ce que je voudrais, c'est une documentation de référence de l'API, avec les descriptions des classes et de leurs membres. Même sur un tout petit projet comme Dvp.NET on l'a fait, alors ça me gonfle un peu que sur des gros projets matures comme NH ils le fassent pas

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •