Question: Je continue à obtenir cette erreur NHibernate lorsque je tente d'insérer une instance de clsSettings dans la base de données:Nhibernate: Exception a eu lieu getter de
exception se est produite getter de nhDBapi.DB.Tables.clsSettings. UID
Voir le cours ci-dessous, toutes les méthodes ci-dessous ne fonctionnent pas, à cause de cette exception. La chose amusante est, cela fonctionne quand tout est dans un exécutable appelé nhDBapi.exe, et même quand il est dans la DLL, le schéma de la table est créé correctement.
Lorsque je déplace exactement le même code dans API_nHibernate.dll chargé par MailServer.exe, il cesse de fonctionner ...
La seule différence entre les deux est dans l'exe, j'utilise:
[NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.DB.Tables.clsSettings, nhDBapi", Table = "T_lsSettings")]
alors que dans le dll i utiliser:
[NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.DB.Tables.clsSettings, API_nHibernate", Table = "T_lsSettings")]
qui devrait être correcte.
Voici la classe:
using System;
using System.Collections.Generic;
using System.Text;
namespace nhDBapi.DB.Tables
{
[NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.DB.Tables.clsSettings, API_nHibernate", Table = "T_lsSettings")]
public class clsSettings
{
[NHibernate.Mapping.Attributes.Id(Name = "UID", Column = "S_UID", TypeType = typeof(System.Guid))]
public virtual System.Guid UID
{
get { return m_UID; }
set { m_UID = value; }
} // UserID
protected System.Guid m_UID;
[NHibernate.Mapping.Attributes.Property(Name = "Settings", Column = "S_Settings", TypeType = typeof(System.Byte[]))]
public virtual System.Byte[] Settings
{
get { return m_Settings; }
set { m_Settings = value; }
} // UserID
protected System.Byte[] m_Settings;
} // End partial class lsSettings
} // End Namespace nhDBapi.DB.Tables
Et ici toutes les méthodes d'insertion j'ai essayé:
// nhDBapi.DBaccess.Insert<nhDBapi.DB.Tables.clsDomains>(x);
public static void InsertRef<T>(ref T RowToAdd)
{
/*
List<T> lsRows = new List<T>();
lsRows.Add(RowToAdd);
Insert<T>(lsRows);
lsRows.Clear();
lsRows = null;
*/
NHibernate.ISession session = m_bsfSessionFactory.OpenSession();
NHibernate.ITransaction transaction = session.BeginTransaction();
session.SaveOrUpdate(RowToAdd);
transaction.Commit();
session.Close();
transaction.Dispose();
session.Dispose();
} // End Sub Insert
// nhDBapi.DBaccess.Insert<nhDBapi.DB.Tables.clsDomains>(x);
public static void Insert<T>(T RowToAdd)
{
/*
List<T> lsRows = new List<T>();
lsRows.Add(RowToAdd);
Insert<T>(lsRows);
lsRows.Clear();
lsRows = null;
*/
NHibernate.ISession session = m_bsfSessionFactory.OpenSession();
NHibernate.ITransaction transaction = session.BeginTransaction();
session.SaveOrUpdate(RowToAdd);
transaction.Commit();
session.Close();
transaction.Dispose();
session.Dispose();
} // End Sub Insert
// nhDBapi.DBaccess.Insert<nhDBapi.DB.Tables.clsDomains>(xx);
public static void Insert<T>(List<T> ListOfRowsToAdd)
{
NHibernate.ISession session = m_bsfSessionFactory.OpenSession();
NHibernate.ITransaction transaction = session.BeginTransaction();
// Tell NHibernate that this object should be saved
// commit all of the changes to the DB and close the ISession
try
{
for (int i = 0; i < ListOfRowsToAdd.Count; ++i)
{
session.SaveOrUpdate(ListOfRowsToAdd[i]);
}
/*
foreach (T tThisRow in ListOfRowsToAdd)
{
// session.Save(tThisRow);
session.SaveOrUpdate(tThisRow);
} // Next tThisRow
*/
transaction.Commit();
session.Close();
transaction.Dispose();
session.Dispose();
} // End try
catch (Exception ex)
{
MsgBox(ex.Message, "Error");
//Console.WriteLine(ex.InnerException.Message);
System.Environment.Exit(1);
} // End catch
} // End Sub Insert
Si je supprime le nom de l'assembly, j'obtiens cette exception: Nhibernate.MappingException: La classe persistante nhDBapi.DB.Tables.clsIMAP_ACL est introuvable. Cause possible: aucun nom d'assembly spécifié ... Au moins, la création de la table fonctionne correctement si je spécifie l'assembly. –
@Quandary: une raison particulière pour laquelle vous définissez la propriété Name? comme je l'ai dit NHibernate l'inférera pour vous. –
Non ce ne sera pas. Ce serait génial si ce n'était pas nécessaire, mais si je ne fournissais pas le nom de l'assembly, alors il jette une exception juste quand j'essaye d'ajouter le mapping au cfg. –