2017-03-21 2 views
0

J'utilise un dbContextwhich est décrit comme suitdbcontext n'épargnent ni attraper exeption

public class DbContext: System.Data.Entity.DbContext 
{ 
    public DbSet<UserAccount> UserAccounts { get; set; } 
    public DbSet<Sesison> Sessions { get; set; } 
} 

Et dans mon action de connexion pour une raison quelconque après avoir vérifié la base de données que l'utilisateur est correcte je ne suis pas en mesure d'utiliser une autre entité du contexte à enregistrer dans la base de données, ce qui se passe est que je ne vais pas obtenir les données enregistrées dans la base de données et il arrêtera effectivement d'exécuter le code après le dc.SaveChanges() mais je ne reçois pas une exception sur mon catch, donc ce que mon navigateur expiriencing est une erreur interne de 500 serveurs.

public ActionResult Login(LoginViewModel model) 
    { 
     using (DbContext dc = new DbContext()) 
     { 
      var v = dc.UserAccounts.SingleOrDefault(a => a.UserName == model.UserName); 
      if (v != null) 
      { 
       if (GetSHA1(model.Password) == v.Password) 
       { 
        Guid sessionGuid =Guid.NewGuid(); 
        var session = dc.Sessions.Add(new Sesison() { SessionID = sessionGuid,StartDateTime=DateTime.UtcNow,UserID = v.UserID,ExpireDateTime=DateTime.UtcNow.AddHours(4)}); 
        System.Web.HttpContext.Current.Session["IsLogin"] = true; 
        System.Web.HttpContext.Current.Session["Session"] = sessionGuid; 
        try 
        { 
         dc.SaveChanges(); 
        } 
        catch (System.Data.Entity.Validation.DbEntityValidationException dbEx) 
        { 
         Exception raise = dbEx; 
         foreach (var validationErrors in dbEx.EntityValidationErrors) 
         { 
          foreach (var validationError in validationErrors.ValidationErrors) 
          { 
           string message = string.Format("{0}:{1}", 
            validationErrors.Entry.Entity.ToString(), 
            validationError.ErrorMessage); 
           // raise a new exception nesting 
           // the current instance as InnerException 
           raise = new InvalidOperationException(message, raise); 
          } 
         } 
         throw raise; 
        } 
        return Json(new 
        { 
         Item1 = "true" 

        }); 
       } 
       else 
       { 
        return Json(new 
        { 
         Item1 = "false", 
         Item2 = "The username or password you entered is incorrect. Please try again." 
        }); 
       } 
      } 
      else 
      { 
       return Json(new 
       { 
        Item1 ="false", 
        Item2 = "The username or password you entered is incorrect. Please try again." 
       }); 
      } 

     } 
     return null; 
    } 
+0

Qu'est-ce que les 500 montrent d'erreur interne du serveur, car si c'est ce qui se passe, je dirais que ce n'est pas un 'System.Data.Entity.Validation.DbEntityValidationException' d'être jeté lorsque vous essayez et d'enregistrer. –

+0

Je ne sais pas, puisque je l'ai juste sur consle depuis son run de jquery –

+0

semble que vous avez raison, j'ai fait quelques modifications à la jquery pour sortir l'erorr L'instruction INSERT était en conflit avec la contrainte FOREIGN KEY "FK_Session_Users". Le conflit s'est produit dans la base de données "FuelSensorDev", la table "dbo.Users", la colonne "id". La déclaration a été terminée. –

Répondre

1

L'appel à SaveChanges est de lancer une exception d'un autre type que DbEntityValidationException

Un rapide coup d'oeil à l'appel DbContext SaveChanges montre qu'il pourrait jeter les types d'exceptions suivantes. Si vous ne voulez pas gérer chacun, vous voudrez probablement ajouter une gestion générique des exceptions pour trouver le problème.

// Exceptions: 
    // T:System.Data.Entity.Infrastructure.DbUpdateException: 
    //  An error occurred sending updates to the database. 
    // 
    // T:System.Data.Entity.Infrastructure.DbUpdateConcurrencyException: 
    //  A database command did not affect the expected number of rows. This usually indicates 
    //  an optimistic concurrency violation; that is, a row has been changed in the database 
    //  since it was queried. 
    // 
    // T:System.Data.Entity.Validation.DbEntityValidationException: 
    //  The save was aborted because validation of entity property values failed. 
    // 
    // T:System.NotSupportedException: 
    //  An attempt was made to use unsupported behavior such as executing multiple asynchronous 
    //  commands concurrently on the same context instance. 
    // 
    // T:System.ObjectDisposedException: 
    //  The context or connection have been disposed. 
    // 
    // T:System.InvalidOperationException: 
    //  Some error occurred attempting to process entities in the context either before 
    //  or after sending commands to the database.