我正在 .NET 3.5、NHibernate 下开发一个 ASP.NET MVC Web 应用程序,并托管在 Windows Azure 上。当 web 应用程序从本地开发结构运行时,它可以正常工作。然而,当我将其移动到 Windows Azure 时,从 MVC Web 角色执行的每次插入都会出现下面列出的异常。
知道我的 NHibernate 逻辑有什么问题吗? (可能是会话管理,不确定)
[AssertionFailure:Lokad.Translate.Entities.User 条目中的 null id(发生异常后不要刷新会话)]
NHibernate.Event.Default.DefaultFlushEntityEventListener.CheckId(对象obj,IEntityPersister持久器,对象id,EntityMode实体模式)+292
NHibernate.Event.Default.DefaultFlushEntityEventListener.GetValues(对象实体,EntityEntry条目,EntityMode实体模式,布尔可能BeDirty,ISessionImplementor会话)+93
NHibernate.Event.Default.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent事件)+158
NHibernate.Event.Default.AbstractFlushingEventListener.FlushEntities(FlushEvent事件)+469
NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent 事件)+339
NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent 事件) +85
NHibernate.Impl.SessionImpl.Flush() +275
NHibernate.Transaction.AdoTransaction.Commit() +236
Lokad.Translate.Repositories.PageRepository.Create(页面页面)
Lokad.Translate.Controllers.PagesController.Create(页面页面)
lambda_method(执行范围,ControllerBase,对象[])+69
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContextcontrollerContext,IDictionary2 parameters) +251
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2个参数)+31
System.Web.Mvc.c__DisplayClassa.b__7() +88
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func1 continuation) +534
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList
1个过滤器,ActionDescriptor actionDescriptor,IDictionary`2个参数)+312
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContextcontrollerContext,字符串actionName)+856
System.Web.Mvc.Controller.ExecuteCore() +185
System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext)+221
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +586
System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&同步完成)+177
请注意,我正在使用_session.FlushMode = FlushMode.Commit;
并且那User
用于自定义RoleProvider
public class SimpleRoleProvider : RoleProvider
{
readonly UserRepository Users = new UserRepository();
public override string[] GetRolesForUser(string username)
{
try
{
var user = Users.Get(username);
// no role if user is not registered
if (null == user) return new string[0];
// default role for registered user
return user.IsManager ? new[] { "Manager", "User" } : new[] { "User" };
}
catch (Exception)
{
// role should not fail in case of DB issue.
return new string[0];
}
}
}
在 NHibernate 事务期间,您不应该捕获异常并忽略它们。
我试着解释一下原因。
例如,可能存在由数据库中的约束引起的异常。 (它也可能是由映射问题、属性抛出的异常或其他任何原因引起的。)NHibernate 尝试将内存中的状态与数据库同步。这是在提交时完成的 - 有时在查询之前完成,以确保查询是在实际数据上完成的。当此同步失败时,数据库中的状态是随机的,一些更改会持续存在,而另一些则不会。在这种情况下,您唯一能做的就是关闭会话。
请考虑代码中的决策和计算基于内存中的值。但是 - 在忽略异常的情况下,该值不是数据库中的值,它们永远不会在那里。所以你的逻辑将决定并计算“幻想数据”。
顺便一提,捕获任何异常(无类型)并忽略它们从来都不是一个好主意。您应该始终知道您处理的异常,并确保您可以继续。
你在这里所做的就是吞掉编程错误。相信我,系统不会更稳定。问题只是:当错误发生时你是否注意到它,或者你是否忽略它甚至将错误结果保存到数据库?当您执行后者时,当您尝试从数据库获取数据时,如果数据库不一致并且出现其他错误,您不必感到惊讶。而且您永远找不到导致错误的实际原因的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)