Frage

Ich entwickle eine ASP.NET MVC-web-app unter .NET 3.5, NHibernate und auf Windows Azure gehostet.Wenn die Web-App wird von der lokalen Entwicklung Gewebe-es funktioniert gut.Doch, wenn ich bewegen auf Windows Azure, jede insert-durchgeführt von der MVC-web-Rolle landet, mit Ausnahme unten aufgeführt.

Irgendeine Idee, was ist falsch mit meinem NHibernate Logik?(könnte sein, das session-management, nicht sicher)

[AssertionFailure:null id in Lokad.Übersetzen.Entitäten.Benutzer-Eintrag (nicht Spülen Sie die Sitzung, nachdem eine Ausnahme Auftritt)] NHibernate.Event.Standard.DefaultFlushEntityEventListener.CheckId(Object obj, IEntityPersister persister -, Objekt-id, EntityMode entityMode) +292 NHibernate.Event.Standard.DefaultFlushEntityEventListener.GetValues(Object entity, EntityEntry entry, EntityMode entityMode, Boolean mightBeDirty, ISessionImplementor Sitzung) +93 NHibernate.Event.Standard.DefaultFlushEntityEventListener.OnFlushEntity(FlushEntityEvent event) +158 NHibernate.Event.Standard.AbstractFlushingEventListener.FlushEntities(FlushEvent event) +469 NHibernate.Event.Standard.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event) +339 NHibernate.Event.Standard.DefaultFlushEventListener.OnFlush(FlushEvent event) +85 NHibernate.Impl.SessionImpl.Flush() +275 NHibernate.Transaktion.AdoTransaction.Commit() +236 Lokad.Übersetzen.Repositories.PageRepository.Erstellen(Seite) Lokad.Übersetzen.Controller.PagesController.Erstellen(Seite) lambda_method(ExecutionScope , ControllerBase , Object[] ) +69 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) +251 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2 Parameter) +31 System.Web.Mvc.<>c__DisplayClassa.b__7() +88 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func -1 continuation) +534 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String 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 step, Boolean& completedSynchronously) +177

Beachten Sie, dass ich bin mit _session.FlushMode = FlushMode.Commit; und, dass die User in einer benutzerdefinierten 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];
        }
    }
}
War es hilfreich?

Lösung 2

Endlich habe ich eine Lösung für mein eigenes problem.Im Fall, dass die Menschen interessieren würde, ich bin Entsendung hier die Lösung.

public class SimpleRoleProvider : RoleProvider 
{
    // isolated session management for the RoleProvider to avoid
    // issues with automated management of session lifecycle.

    public override string[] GetRolesForUser(string username)
    {
        using (var session = GlobalSetup.SessionFactory.OpenSession())
        {
            var users = new UserRepository(session);
            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"};
        }
    }
}

Im Grunde, was passiert war, ist, dass die RoleProvider repository nicht scheinen, um die gleiche Lebenszyklus als normale in-Sicht / im-controller-repositories.Als Ergebnis, die zum Zeitpunkt der RoleProvider genannt wird, die NHibernate-Sitzung wurde bereits entsorgt verursacht die Ausnahme beobachtet hier oben.

Ich habe ersetzt den code durch den folgenden hier oben.Dafür hat man seine eigenen NHibernate session-management, und landet fein arbeiten.

Andere Tipps

Sie sollten niemals abfangen von Ausnahmen und Ignoriere Sie während einer NHibernate-Transaktion.

Ich versuche zu erklären, warum.

Es könnte Ausnahmen z.B. hervorgerufen durch Einschränkungen in der Datenbank.(es könnte auch verursacht werden durch mapping-Probleme, Ausnahmen von Eigenschaften oder irgendetwas anderes.) NHibernate versucht, synchronisieren die state, in Speicher, mit die Datenbank.Dies erfolgt auf Begehen Sie - und manchmal, bevor Sie Abfragen, um sicherzustellen, dass Abfragen durchgeführt, die auf tatsächlichen Daten.Wenn die Synchronisierung fehlschlägt, der Staat in der Datenbank ist etwas zufällig, einige änderungen sind permanent, andere nicht.Das einzige, was Sie tun können, ist in diesem Fall schließen Sie die Sitzung.

Bedenken Sie, dass Entscheidungen und Berechnungen im code basieren, auf die Werte im Speicher.Aber - im Falle eines ignoriert Ausnahme, diese Werte sind nicht die Werte in der Datenbank sind, werden Sie nie dabei sein.So Ihre Logik wird entscheiden und berechnen Sie auf die "fantasy-Daten'.

Durch die Art und Weise, es ist nie eine gute Idee, Sie zu fangen jede Ausnahme (nicht typisiert), und ignoriert Sie.Sie sollten immer wissen, die Ausnahmen, die Sie behandeln, und werden Sie sicher, dass Sie fortfahren können.

Was Sie hier tun, ist, zu schlucken Fehler in der Programmierung.Glauben Sie mir, das system nicht mehr stabil.Die Frage ist nur:bemerken Sie den Fehler, wenn es Auftritt, oder tun Sie es ignorieren und sogar speichern Sie das Ergebnis der Fehler in der Datenbank?Wenn Sie letzteres tun, müssen Sie nicht überrascht sein, wenn Sie Ihre Datenbank ist inkonsistent und andere Fehler auftreten, wenn Sie versuchen, die Daten aus der Datenbank.Und Sie wird nie den code, der die eigentliche Ursache für den Fehler.

Diese Ausnahme kann auftreten, wenn die Spaltennamen aus reservierten Wörtern (z.B.verwenden status als eine Spalte name, und es wird unmöglich, zu Sparen)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top