2009-11-19 3 views
0

Je joue avec SubSonic 3 ActiveRecord. J'ai une table appelée utilisateurs et je les champs suivants dans une base de données MySQL:Pourquoi SubSonic ActiveRecord ne mettra-t-il pas à jour mes données?

CREATE TABLE `users` (
    `ID` int(10) NOT NULL auto_increment, 
    `Username` varchar(50) NOT NULL, 
    `FirstName` varchar(50) default NULL, 
    `LastName` varchar(50) default NULL, 
    `EmailAddress` varchar(100) default NULL, 
    `OfficePhone` varchar(25) default NULL, 
    `MobilePhone` varchar(25) default NULL, 
    `TimeZone` varchar(25) default NULL, 
    `LastLogin` datetime default NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 

Je peux lire à partir de la table sans problème. Je peux ajouter de nouveaux enregistrements sans problèmes, mais je ne peux pas mettre à jour les enregistrements existants pour une raison quelconque. J'ai parcouru le code et l'objet editUser contient les données correctes.

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(FormCollection result) 
    { 
     var editUser = ServiceDesk.Data.User.SingleOrDefault(x => x.ID == Convert.ToInt32(result["ID"])); 
     UpdateModel(editUser); 
     editUser.Save(); 
     return RedirectToAction("Index", "Home"); 
    } 

Voici l'erreur que je reçois:

Server Error in '/' Application. 

The given key was not present in the dictionary. 

Description: An unhandled exception occurred during the execution of the current web  request. Please review the stack trace for more information about the error and where it  originated in the code. 

Exception Details: System.Collections.Generic.KeyNotFoundException: The given key was  not present in the dictionary. 

Source Error: 

Line 1423:    
Line 1424:   if(this._dirtyColumns.Count>0) 
Line 1425:    _repo.Update(this,provider); 
Line 1426:   OnSaved(); 
Line 1427:  } 

Source File: D:\Users\Mike\Documents\Visual Studio 2008\Projects\dolphin\src\ServiceDesk.Web\Models\_Generated\ActiveRecord.cs Line:  1425 

Quelqu'un peut-il offrir une aide?

Voici la trace de la pile: [KeyNotFoundException:. La clé donnée était présente dans le dictionnaire] System.ThrowHelper.ThrowKeyNotFoundException() +28 System.Collections.Generic.Dictionary 2.get_Item(TKey key) +7456284 SubSonic.Extensions.Database.ToUpdateQuery(T item, IDataProvider provider) +642 SubSonic.Repository.SubSonicRepository 1.Update (T article , Fournisseur IDataProvider) +113 ServiceDesk.Data.User.Update (Fournisseur IDataProvider) dans D: \ Utilisateurs \ Mike \ Documents \ Visual Studio 2008 \ Projets \ dolphin \ src \ ServiceDesk.Web \ Models_Generated \ ActiveRecord.cs: 1425 ServiceDesk.Data.User.Save (Fournisseur IDataProvider) dans D: \ Utilisateurs \ Mike \ Documents \ Visual Studio 2008 \ Projets \ dolphin \ src \ ServiceDesk.Web \ Models_Generated \ ActiveRecord.cs: 1461 ServiceDesk.Data.User.Save() dans D: \ Utilisateurs \ Mike \ Documents \ Visual Studio 2008 \ Project s \ dolphin \ src \ ServiceDesk.Web \ Modèles_Généré \ ActiveRecord.cs: 1452 ServiceDesk.Web.Controllers.SettingController.Edit (résultat FormCollection) dans D: \ Utilisateurs \ Mike \ Documents \ Visual Studio 2008 \ Projects \ dolphin \ src \ ServiceDesk.Web \ Controllers \ SettingController.cs: 48 lambda_method (ExecutionScope, ControllerBase, Object []) +140 System.Web.Mvc.ActionMethodDispatcher.Execute (contrôleur ControllerBase, paramètres Object []) +17 System.Web .Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary 2 parameters) +178 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 paramètres) +24 System.Web.Mvc. <> c__DisplayClassa.b__7() +52 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter (filtre IActionFilter, ActionExecutingContext preContext, filtres Func 1 continuation) +254 System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList 1, ActionDescriptor ActionDescriptor, les paramètres IDictionary`2) 192 System.Web.Mvc.ControllerActionInvoker. InvokeAction (ControllerContext controllerContext, String actionName) +399 System.Web.Mvc.Controller.ExecuteCore() +126 System.Web.Mvc.ControllerBase.Execute (RequestContext requestContext) +27 System.Web.Mvc.ControllerBase.System .Web.Mvc.IController.Execute (RequestContext requestContext) +7 System.Web.Mvc.MvcHandler.ProcessRequest (HttpContextBase httpContext) +151 System.Web.Mvc.MvcHandler.ProcessRequest (HttpContext httpContext) +57 System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest (HttpContext HttpContext) 7 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 181 System.Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & completedSynchronously) +75

On dirait que le problème est dans ce code:

public static ISqlQuery ToUpdateQuery<T>(this T item, IDataProvider provider) where T : class, new() 
    { 
     Type type = typeof(T); 
     var settings = item.ToDictionary(); 

     ITable tbl = provider.FindOrCreateTable<T>(); 

     Update<T> query = new Update<T>(tbl.Provider); 
     if(item is IActiveRecord) 
     { 
      var ar = item as IActiveRecord; 
      foreach(var dirty in ar.GetDirtyColumns()) 
      { 
       if(!dirty.IsPrimaryKey && !dirty.IsReadOnly) 
        query.Set(dirty.Name).EqualTo(settings[dirty.Name]); 
      } 
     } 

dirty.Name = "FirstName", mais les paramètres [ "FirstName"] n'existe pas, cependant settings ["Prénom"] existe.Mes colonnes dans le db sont nommées comme "FirstName", "LastName", etc mais subsonic ActiveRecord modèle nommé les champs d'objet comme "Prénom" et "Lastname"

Répondre

1

Ma première supposition est que TimeZone est un mot réservé en C# (System.TimeZone) et même si cela ne devrait vraiment pas avoir d'importance - c'est la première chose à laquelle je peux penser. L'erreur clé pourrait être que SubSonic essaye de trouver une propriété avec le nom "TimeZone" qui a été renommé - vérifiez votre table Structs.cs class/User pour voir si c'est le cas.

Si oui, s'il vous plaît déposer un bug. Sinon, une trace de pile pourrait aider.

+0

Merci Rob. Je vais essayer. Je chargeais juste la source et l'ajoutais à mon projet mais je vais essayer de renommer TimeZone en premier. –

+0

pas de chance. J'ai ajouté la trace de la pile. Je vais passer en revue le code plus tard et voir si je peux comprendre à moins que vous ne voyiez autre chose. –

+0

voir ci-dessus, j'ai trouvé le problème, maintenant juste besoin de le corriger –

0

Je reçois également cette exception dans la version 3.0.0.4 lorsque j'essaie de mettre à jour une ligne. J'ai déjà utilisé SubSonic 1.0 mais c'est ma première tentative d'utiliser v3 - donc j'ai peut-être oublié quelque chose dans le processus ..

La solution de contournement la plus rapide que j'ai trouvé est de simplement supprimer la ligne, puis insérez-la directement après .. Ceci est probablement moins efficace que la simple mise à jour - mais peut être acceptable dans des contextes qui ne sont pas critiques pour les performances.

Questions connexes