为什么SubSonic ActiveRecord不会更新我的数据?

时间:2009-11-19 21:08:49

标签: c# asp.net-mvc subsonic subsonic3

我正在玩SubSonic 3 ActiveRecord。我有一个名为Users的表,我在MySQL数据库中有以下字段:

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  

我可以从表中读到没有问题。我可以添加没有问题的新记录,但由于某种原因我无法更新现有记录。我已经逐步完成了代码,editUser对象中包含了正确的数据。

[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");
    }

这是我得到的错误:

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 

有人可以提供一些帮助吗?

这是堆栈跟踪: [KeyNotFoundException:字典中没有给定的键。]    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 item,IDataProvider provider)+113    D:\ Users \ Mike \ Documents \ Visual Studio 2008 \ Projects \ dolphin \ src \ ServiceDesk.Web \ Models_Generated \ ActiveRecord.cs中的ServiceDesk.Data.User.Update(IDataProvider提供程序):1425    D:\ Users \ Mike \ Documents \ Visual Studio 2008 \ Projects \ dolphin \ src \ ServiceDesk.Web \ Models_Generated \ ActiveRecord.cs中的ServiceDesk.Data.User.Save(IDataProvider提供程序):1461    D:\ Users \ Mike \ Documents \ Visual Studio 2008 \ Projects \ dolphin \ src \ ServiceDesk.Web \ Models_Generated \ ActiveRecord.cs中的ServiceDesk.Data.User.Save():1452    D:\ Users \ Mike \ Documents \ Visual Studio 2008 \ Projects \ dolphin \ src \ ServiceDesk.Web \ Controllers \ SettingController.cs中的ServiceDesk.Web.Controllers.SettingController.Edit(FormCollection结果):48    lambda_method(ExecutionScope,ControllerBase,Object [])+140    System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller,Object []参数)+17    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters) +178 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2个参数)+24    System.Web.Mvc。&lt;&gt; c__DisplayClassa.b__7()+52    System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter过滤器,ActionExecutingContext preContext,Func 1 continuation) +254 System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList 1个过滤器,ActionDescriptor actionDescriptor,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(IExecutionStep step,Boolean&amp; completedSynchronously)+75

看起来问题在于此代码:

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”但设置[“FirstName”]不存在,但设置[“Firstname”]确实存在。我在db中的列被命名为“FirstName”,“LastName”等,但亚音速ActiveRecord模板命名为对象字段,如“Firstname”和“Lastname”

2 个答案:

答案 0 :(得分:1)

我的第一个猜测是TimeZone是C#(System.TimeZone)中的保留字,虽然这无关紧要 - 但这是我能想到的第一件事。 Key错误可能是SubSonic试图找到一个名为“TimeZone”的属性,该属性已被重命名 - 请检查您的Structs.cs类/用户表以查看是否属于这种情况。

若是,请提交错误。如果不是 - 堆栈跟踪会有所帮助。

答案 1 :(得分:0)

在尝试更新行时,我也在3.0.0.4版本中遇到此异常。我之前使用的是SubSonic 1.0,但这是我第一次尝试使用v3 - 所以我可能忽略了这个过程中的一些东西..

我发现最快的解决方法是简单地删除该行,然后将其直接插入..这可能不仅仅是更新效率低 - 但在非性能关键的上下文中可能是可接受的。