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"
Merci Rob. Je vais essayer. Je chargeais juste la source et l'ajoutais à mon projet mais je vais essayer de renommer TimeZone en premier. –
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. –
voir ci-dessus, j'ai trouvé le problème, maintenant juste besoin de le corriger –