问题:当我尝试将clsSettings实例插入数据库时,我继续遇到这个nhibernate错误:
发生了异常 nhDBapi.DB.Tables.clsSettings.UID
请参阅下面的类,由于此异常,该类下面的所有方法都不起作用。
有趣的是,当一切都在名为nhDBapi.exe的可执行文件中时,它就可以工作,即使它在dll中,也可以正确创建表模式。
当我将完全相同的代码移动到MailServer.exe加载的API_nHibernate.dll中时,它会停止工作...
两者之间的唯一区别是在exe中,我使用:
[NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.DB.Tables.clsSettings, nhDBapi", Table = "T_lsSettings")]
在我使用的dll中:
[NHibernate.Mapping.Attributes.Class(Name = "nhDBapi.DB.Tables.clsSettings, API_nHibernate", Table = "T_lsSettings")]
哪个应该是正确的。
这里的课程:
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
这里我尝试了所有插入方法:
// 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
答案 0 :(得分:1)
IIRC NHibernate.Mapping.Attributes.Class
的Name属性不是类型名称,而是NHibernate 实体名称。它不应包含程序集名称。实际上,您甚至不需要定义Name属性,NHibernate会为您推断它。它只是在你想要覆盖它的情况下。
所以如果 这个问题确实是由此引起的,请删除Name属性,它应该有效。如果没有,还有其他一些区别。