Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 什么会导致NHibernate';s Save方法以静默方式失败?_Asp.net Mvc_Nhibernate - Fatal编程技术网

Asp.net mvc 什么会导致NHibernate';s Save方法以静默方式失败?

Asp.net mvc 什么会导致NHibernate';s Save方法以静默方式失败?,asp.net-mvc,nhibernate,Asp.net Mvc,Nhibernate,我的任务是接管一个现有的ASP.NET MVC 2.0 web应用程序,该应用程序是由第三方开发人员开发的,他不再提供任何帮助。有一项要求是向项目中添加一些功能,这要求项目升级到.NET 4.5,该升级已经执行 MSSQL 2008 R2数据库访问的基础站点已使用NHibernate版本2.0.1.4000以及Castle和FluentNHibernate实现 这是我参与的第一个使用NHibernate的项目,我遇到了一个困扰我的问题。在升级到.NET 4.5之前,该问题并不存在 除一个数据库操

我的任务是接管一个现有的ASP.NET MVC 2.0 web应用程序,该应用程序是由第三方开发人员开发的,他不再提供任何帮助。有一项要求是向项目中添加一些功能,这要求项目升级到.NET 4.5,该升级已经执行

MSSQL 2008 R2数据库访问的基础站点已使用NHibernate版本2.0.1.4000以及Castle和FluentNHibernate实现

这是我参与的第一个使用NHibernate的项目,我遇到了一个困扰我的问题。在升级到.NET 4.5之前,该问题并不存在

除一个数据库操作外,所有数据库操作均正常工作。保存特定对象(
Opportunity
type)到数据库(此对象直接映射到Opportunity数据库表)失败。在保存(在本例中为SQL UPDATE语句)之前,对象设置了新值。但数据库中的记录保存后总是具有旧值

连接log4net以查看调试代码表明记录确实已更新,但在UPDATE语句中使用了旧值

令人惊讶的是,
Opportunity
对象最初是使用相同的保存方法保存的(尽管是通过不同的操作方法),这样就可以保存到数据库中

所以我的问题是,什么会导致这种情况发生?既然我不是NHibernate专家,那么NHibernate版本是否与.NET4.5完全不兼容?或者任何人都可以提供一个指针,指出问题可能是什么?我很乐意展示任何代码,但由于代码太多,我需要知道是什么。下面是一个开始:

Global.asax对NHibernate的引用如下:

private static void MvcApplication_BeginRequest(object sender, System.EventArgs e)
{
    NHibernateSessionManager.Instance.BeginTransaction();
}

private static void MvcApplication_EndRequest(object sender, System.EventArgs e)
{
    NHibernateSessionManager.Instance.CommitTransaction();
}
NHibernateSessionManager
类定义为(
Opportunity
源自
DomainBase
):

公共密封类NHibernateSessionManager
{
私人ISessionFactory sessionFactory;
私有配置;
#区域线程安全、懒惰的单例
公共静态NHibernateSessionManager实例
{
得到
{
返回Nested.nHibernateSessionManager;
}
}
私人NHibernateSessionManager()
{
InitSessionFactory();
}
私有类嵌套
{
内部静态只读NHibernateSessionManager NHibernateSessionManager=新的NHibernateSessionManager();
}
#端区
私有void InitSessionFactory()
{
var autoMappings=AutoPersistenceModel.mapentiesfromsassemblyof()的
。其中(类型=>
typeof(DomainBase).IsAssignableFrom(类型)&&
type.IsClass&&
!type.IsAbstract)
.带设置(s=>
{
s、 IsBaseType=type=>
type==typeof(DomainBase);
})
.UseOverridesFromAssemblyOf()的
.ConventionDiscovery.Add(DefaultLazy.AlwaysTrue())
.ConventionDiscovery.Add()
.ConventionDiscovery.Add()
.ConventionDiscovery.Add();
sessionFactory=fluntly.Configure()
.数据库(MsSqlConfiguration.MsSql2005
.ConnectionString(c=>c.FromConnectionStringWithKey(“默认”))
.UseReflectionOptimizer()
.Cache(c=>c.UseQueryCache().UseMininMapputs().ProviderClass())
.ShowSql())
.Mappings(m=>m.AutoMappings.Add(AutoMappings))
.ExposeConfiguration(设置配置)
.BuildSessionFactory();
}
专用void SetConfiguration(配置cfg)
{
config=cfg;
}
公共无效注册侦听器(侦听器侦听器)
{
ISession会话=线程会话;
if(session!=null&&session.IsOpen)
{
抛出新的CacheException(“一旦会话已经打开,就不能注册拦截器”);
}
GetSession(拦截器);
}
公共无效生成模式()
{
新SchemaExport(config).Execute(false,true,false,false);
}
公共会话GetSession()
{
返回GetSession(null);
}
专用ISession GetSession(IInterceptor侦听器)
{
ISession会话=线程会话;
if(会话==null)
{
if(拦截器!=null)
{
session=sessionFactory.OpenSession(拦截器);
}
其他的
{
session=sessionFactory.OpenSession();
}
线程会话=会话;
}
返回会议;
}
公共会话()
{
ISession会话=线程会话;
threadSession=null;
if(session!=null&&session.IsOpen)
{
session.Close();
}
}
公共无效开始生效()
{
ITransaction事务=线程事务;
if(事务==null)
{
事务=GetSession().BeginTransaction();
线程事务=事务;
}
}
公共无效委托交易()
{
ITransaction事务=线程事务;
尝试
{
if(transaction!=null&&!transaction.WasCommitted&&!transaction.wasrollledback)
{
Commit();
threadTransaction=null;
}
}
捕获(休眠异常)
{
回滚事务();
投掷;
}
}
公共无效回滚事务()
{
ITransaction事务=线程事务;
尝试
{
threadTransaction=null;
if(transaction!=null&&!transaction.WasCommitted&&!transaction.W
public sealed class NHibernateSessionManager
{
    private ISessionFactory sessionFactory;
    private Configuration config;

    #region Thread-safe, lazy Singleton

    public static NHibernateSessionManager Instance
    {
        get
        {
            return Nested.nHibernateSessionManager;
        }
    }

    private NHibernateSessionManager()
    {
        InitSessionFactory();
    }

    private class Nested
    {
        internal static readonly NHibernateSessionManager nHibernateSessionManager = new NHibernateSessionManager();
    }

    #endregion


    private void InitSessionFactory()
    {
        var autoMappings = AutoPersistenceModel.MapEntitiesFromAssemblyOf<DomainBase>()
            .Where(type =>
                   typeof(DomainBase).IsAssignableFrom(type) &&
                   type.IsClass &&
                   !type.IsAbstract)
            .WithSetup(s =>
                           {
                               s.IsBaseType = type =>
                                              type == typeof (DomainBase);
                           })
            .UseOverridesFromAssemblyOf<OpportunityMappingOverride>()
            .ConventionDiscovery.Add(DefaultLazy.AlwaysTrue())
            .ConventionDiscovery.Add<CascadeAllHasOneConvention>()
            .ConventionDiscovery.Add<CascadeAllHasManyConvention>()
            .ConventionDiscovery.Add<CascadeAllReferenceConvention>();

        sessionFactory = Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2005
                        .ConnectionString(c => c.FromConnectionStringWithKey("Default"))
                        .UseReflectionOptimizer()
                        .Cache(c => c.UseQueryCache().UseMininmalPuts().ProviderClass<SysCacheProvider>())
                        .ShowSql())
            .Mappings(m => m.AutoMappings.Add(autoMappings))
            .ExposeConfiguration(SetConfiguration)
            .BuildSessionFactory();
    }

    private void SetConfiguration(Configuration cfg)
    {
        config = cfg;
    }

    public void RegisterInterceptor(IInterceptor interceptor)
    {
        ISession session = threadSession;

        if (session != null && session.IsOpen)
        {
            throw new CacheException("You cannot register an interceptor once a Session has already been opened");
        }

        GetSession(interceptor);
    }

    public void GenerateSchema()
    {
        new SchemaExport(config).Execute(false, true, false, false);
    }

    public ISession GetSession()
    {
        return GetSession(null);
    }

    private ISession GetSession(IInterceptor interceptor)
    {
        ISession session = threadSession;

        if (session == null)
        {
            if (interceptor != null)
            {
                session = sessionFactory.OpenSession(interceptor);
            }
            else
            {
                session = sessionFactory.OpenSession();
            }

            threadSession = session;
        }

        return session;
    }

    public void CloseSession()
    {
        ISession session = threadSession;
        threadSession = null;

        if (session != null && session.IsOpen)
        {
            session.Close();
        }
    }

    public void BeginTransaction()
    {
        ITransaction transaction = threadTransaction;

        if (transaction == null)
        {
            transaction = GetSession().BeginTransaction();
            threadTransaction = transaction;
        }
    }

    public void CommitTransaction()
    {
        ITransaction transaction = threadTransaction;

        try
        {
            if (transaction != null && !transaction.WasCommitted && !transaction.WasRolledBack)
            {
                transaction.Commit();
                threadTransaction = null;
            }
        }
        catch (HibernateException)
        {
            RollbackTransaction();
            throw;
        }
    }

    public void RollbackTransaction()
    {
        ITransaction transaction = threadTransaction;

        try
        {
            threadTransaction = null;

            if (transaction != null && !transaction.WasCommitted && !transaction.WasRolledBack)
            {
                transaction.Rollback();
            }
        }
        finally
        {
            CloseSession();
        }
    }

    private static ITransaction threadTransaction
    {
        get
        {
            return (ITransaction)CallContext.GetData("THREAD_TRANSACTION");
        }
        set
        {
            CallContext.SetData("THREAD_TRANSACTION", value);
        }
    }

    private static ISession threadSession
    {
        get
        {
            return (ISession)CallContext.GetData("THREAD_SESSION");
        }
        set
        {
            CallContext.SetData("THREAD_SESSION", value);
        }
    }
}
    private static ITransaction threadTransaction
    {
        get
        {
            try
            {
                return (ITransaction)System.Web.HttpContext.Current.Items["THREAD_TRANSACTION"];
            }
            catch
            {
                return (ITransaction)CallContext.GetData("THREAD_TRANSACTION");
            }
        }
        set
        {
            try
            {
                System.Web.HttpContext.Current.Items["THREAD_TRANSACTION"] = value;
            }
            catch
            {
                CallContext.SetData("THREAD_TRANSACTION", value);
            }
        }
    }

    private static ISession threadSession
    {
        get
        {
            try
            {
                return (ISession)System.Web.HttpContext.Current.Items["THREAD_SESSION"];
            }
            catch
            {
                return (ISession)CallContext.GetData("THREAD_SESSION");
            }
        }
        set
        {
            try
            {
                System.Web.HttpContext.Current.Items["THREAD_SESSION"] = value;
            }
            catch
            {
                CallContext.SetData("THREAD_SESSION", value);
            }
        }
    }