为什么我的asp.net-MVC使用NHibernate简单地停止做更新和删除网站?(Why wou

2019-09-22 20:07发布

我有一个使用NHibernate的一个MySQL数据库的接口非常简单的CRUD asp.net-MVC的网站。 我使用的UnitOfWork和信息库模式。 (通过的NuGet)升级到MVC 4和最新的NHibernate和MySQL的版本之后,我突然看到更新和删除已经停止工作一个奇怪的问题。

这里有一个例子在我的控制器停止工作删除代码:

    public ActionResult Delete(int id)
    {
        MyEvent c = _eventRepository.FindBy(id);

        _unitOfWork.Begin();
        _eventRepository.Delete(c);
        _unitOfWork.End();

        return RedirectToAction("Index");
    }

其中的UnitOfWork的代码如下所示:

    public UnitOfWork(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
        Session = _sessionFactory.OpenSession();
        Session.FlushMode = FlushMode.Auto;
    }

   public void End()
    {
        Commit();
        if (Session.IsOpen)
        {
            Session.Close();
        }
    }

    public void Commit()
    {
        if (!_transaction.IsActive)
        {
            throw new InvalidOperationException("No active transation");
        }
        _transaction.Commit();
    }

    public void Begin()
    {
        _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
    }

我测试并称精细工作的新项目(新行显示了在数据库表),但是当我测试更新任何或删除,该代码运行正常(我不明白在代码的任何例外),但该字段不是当我做一个更新更新,当我运行删除代码不会被删除的记录。

因此,要回顾一下,从MySQL数据库中读取数据正常工作,这样做增加了作品不错,但更新和删除已停止所有表(这之前没有工作)工作。 我做了一个测试做使用蟾蜍为MySQL常规的SQL,并且运行良好(使用我使用在我的代码连接相同的登录凭据)

为了帮助调试多一点,我就开始了NHibernate的探查,这是我看到的删除或更新条目:

这是我所看到的加载通常读页面:

不知道这是在解释这个问题有所帮助,但我想它不能伤害添加屏幕截图。

什么可能会发生任何建议。 难道这是一个权利问题(对某些软件库的bug?)。 再次,高于此代码前面提到的肯定是工作。

这是我的Ninject Ioc的代码:

        string connectionString = ConfigurationManager.ConnectionStrings["LocalMySqlServer"].ConnectionString;

        var helper = new NHibernateHelper(connectionString);
        Bind<ISessionFactory>().ToConstant(helper.SessionFactory)
            .InSingletonScope();

        Bind<IUnitOfWork>().To<UnitOfWork>();

        var sessionProvider = new SessionProvider();
        Bind<ISession>().ToProvider(sessionProvider);

        var unitOfWork = new UnitOfWork(helper.SessionFactory);

        Bind(typeof(IIntKeyedRepository<>)).To(typeof(Repository<>));
    }

这里是我unitofwork.cs代码:

public class UnitOfWork : IUnitOfWork
{
    private readonly ISessionFactory _sessionFactory;
    private ITransaction _transaction;

    public ISession Session { get; private set; }

    public UnitOfWork(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
        Session = _sessionFactory.OpenSession();
        Session.FlushMode = FlushMode.Auto;
    }

    public void End()
    {
        Commit();
        if (Session.IsOpen)
        {
            Session.Close();
        }
    }

    public void Begin()
    {
        _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
    }

    public void Dispose()
    {
        if (Session.IsOpen)
        {
            Session.Close();
        }
    }

    public void Commit()
    {
        if (!_transaction.IsActive)
        {
            throw new InvalidOperationException("No active transation");
        }
        _transaction.Commit();
    }

    public void Rollback()
    {
        if (_transaction.IsActive)
        {
            _transaction.Rollback();
        }
    }
}

这里是我的仓库代码:

public class Repository<T> : IIntKeyedRepository<T> where T : class
{
    private readonly ISession _session;
    private ITransaction _trans;

    public T FindBy(int id)
    {
        return _session.Get<T>(id);
    }

    public Repository(ISession session)
    {
        _session = session;
    }

    public bool Add(T entity)
    {
        _session.Save(entity);
        return true;
    }

    public bool Add(IEnumerable<T> items)
    {
        foreach (T item in items)
        {
            _session.Save(item);
        }
        return true;
    }

    public bool Update(T entity)
    {
        _session.Update(entity);
        return true;
    }

    public bool Delete(T entity)
    {
        _session.Delete(entity);
        return true;
    }

    public bool Delete(IEnumerable<T> entities)
    {
        foreach (T entity in entities)
        {
            _session.Delete(entity);
        }
        return true;
    }

    #endregion

    #region IIntKeyedRepository<T> Members

    public T FindBy(int id)
    {
        return _session.Get<T>(id);
    }

    #endregion

    #region IReadOnlyRepository<T> Members

    public IQueryable<T> All()
    {
        return _session.Query<T>();
    }

    public T FindBy(Expression<Func<T, bool>> expression)
    {
        return FilterBy(expression).Single();
    }

    public IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
    {
        return All().Where(expression).AsQueryable();
    }
}

Answer 1:

此代码包括查找并删除在单个会话的范围函数的调用。 因为我认为,从问题的代码问题是使用不同的。

public T RemoveById(int id)
{
    _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
    T res=_session.Get<T>(id);
    _session.Delete(entity);
    _transaction.Commit(); 
}

(从行动呼吁:)

RemoveById<MyEvent>(id)


文章来源: Why would my asp.net-mvc site using nhibernate simply stop doing updates and deletes?