2017-06-05 2 views
0

J'ai reçu ce message d'erreur lorsque j'essayais d'exécuter mon programme ORM.SCOPE_IDENTITY lors de l'insertion de valeurs

NHibernate.Exceptions.GenericADOException: « n'a pas pu insérer: [NHibernateWinFormsApp.Employee] [SQL: INSERT INTO employés DÉFAUT VALEURS; sélectionnez SCOPE_IDENTITY()] »

Ceci est mon fichier de mappage EDIT

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="NHibernateWinFormsApp" 
        namespace="NHibernateWinFormsApp"> 

    <class name="Employee"> 
    <id name="EmployeeId" column="EmployeeId"> 
     <column name="EmployeeId" not-null="true" /> 
     <column name="FirstName" /> 
     <column name="LastName" /> 
     <generator class="native"/> 
    </id> 

    <bag name="Department" table="EmployeeDepartment" > 
     <key column="EmployeeId" not-null="true" /> 
     <many-to-many class="Department" column="DepartmentId"/> 
    </bag> 
    </class> 

    <class name="Department"> 
    <id name="DepartmentId"> 
     <column name="DepartmentId" not-null="true" /> 
     <column name="DepartmentName" /> 
     <generator class="native"/> 
    </id> 

    <bag name="Employee" table="EmployeeDepartment" inverse="true"> 
     <key column="DepartmentId" not-null="true"/> 
     <many-to-many class="Employee" column="EmployeeId"/> 
    </bag> 
    <property name="DepartmentName" type="string"/> 
    </class> 

</hibernate-mapping> 

Et, dans ma session:

DepartmentRepository departmentRepository = new DepartmentRepository(session); 

// get department by id 
Department department = departmentRepository.GetById(int.Parse(textDepartment.Text)); 
employeeData.Department = new List<Department>(); 
employeeData.Department.Add(department); 
department.Employee.Add(employeeData); 

Est-ce que quelqu'un sait comment résoudre ce petit problème?

+0

Copie possible de [n'a pas pu insérer select SCOPE \ _IDENTITY() fluent nhibernate un à plusieurs] (https://stackoverflow.com/questions/25096975/could-not-insert-select-scope-identity-fluent-nhibernate -one-to-many) –

+0

@ahmedabdelqader Je ne suis pas sûr de pouvoir être d'accord. S'il te plaît, dis-moi si j'ai tort. :) – user7879148

+0

Est-ce le message d'erreur complet? Pour moi, il semble tronqué. SQL-Server devrait en dire plus. Inspectez les exceptions internes, recherchez 'SqlException' et consultez leurs propriétés' Errors'. Sinon, capturez l'insertion SQL défectueuse et relisez-la directement sur votre db. –

Répondre

1

Il semble que vous n'avez pas mappé certaines colonnes qui doivent avoir des valeurs différentes entre deux enregistrements. Ils sont donc toujours insérés avec null, mais vous ne pouvez en avoir qu'un, ce qui entraîne l'échec de toutes les autres insertions. Supprimez cette contrainte ou assouplissez-la (en la remplaçant par un index unique filtré en ignorant les valeurs null) ou associez ces colonnes à certaines propriétés et attribuez-leur des valeurs uniques pour chaque salarié.

Mais bon, la ligne de fond de votre problème est: toujours consulter tous les InnerException et leurs propriétés spécifiques le cas échéant. Ce n'est pas un conseil spécifique de NHibernate, vous devriez le faire avec toutes les exceptions que vous rencontrez.

+0

Oui, je pense que le problème est dans le fichier de mappage. Je vais chercher, et brb. Merci, @ Frédéric. – user7879148

+0

Bonjour, @ Frédéric. J'ai changé le fichier de mappage (s'il vous plaît, voir mon EDIT ci-dessus). J'ai reçu ce message 'Clé étrangère (FKCE90096CDE039EE9: EmployeeDepartment [DepartmentId])) doit avoir le même nombre de colonnes que la clé primaire référencée (Department [DepartmentId, DepartmentName])'. Je ne suis pas sûr si je comprends bien le principe de la cartographie plusieurs-à-plusieurs. Excusez mon ignorance :) – user7879148

+0

@ user7879148 Ne transformez pas une question en une autre. Demandez-en un nouveau. –