我有一个使用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();
}
}