Nhibernate:异常发生了

时间:2010-12-12 17:56:34

标签: nhibernate api exception

问题:当我尝试将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

1 个答案:

答案 0 :(得分:1)

IIRC NHibernate.Mapping.Attributes.Class的Name属性不是类型名称,而是NHibernate 实体名称。它不应包含程序集名称。实际上,您甚至不需要定义Name属性,NHibernate会为您推断它。它只是在你想要覆盖它的情况下。

所以如果 这个问题确实是由此引起的,请删除Name属性,它应该有效。如果没有,还有其他一些区别。