代码之家  ›  专栏  ›  技术社区  ›  Barbaros Alp

值不能为空。参数名称:键[重复]

  •  4
  • Barbaros Alp  · 技术社区  · 15 年前

    这个问题已经有了答案:

    值不能为空。参数名称:键

    自从我将structureMapControllerFactory实现为我的默认ControllerFactory之后,我就开始得到这个错误。

    实际上,我复制了MVC示例应用程序storefront中的代码,但我不明白为什么这个错误会不断出现。即使出现此错误,应用程序仍在运行。

    这个错误的原因可能是什么?

    谢谢你抽出时间


    System.ArgumentNullException was unhandled by user code
      Message="Value cannot be null.\r\nParameter name: key"
      Source="mscorlib"
      ParamName="key"
      StackTrace:
           at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
           at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
           at System.Collections.Generic.Dictionary`2.ContainsKey(TKey key)
           at StructureMap.Util.Cache`2.get_Item(KEY key)
           at StructureMap.BuildSession.CreateInstance(Type pluginType)
           at StructureMap.Container.GetInstance(Type pluginType)
           at StructureMap.ObjectFactory.GetInstance(Type pluginType)
           at Yacht.Web.Controllers.StructureMapControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) in D:\Documents\WebSites\JOBS\Yacht\Yacht.Web\Controllers\StructureMapControllerFactory.cs:line 16
           at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
           at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
           at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
           at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
           at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
           at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
           at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
      InnerException: 
    

    这是structureMapControllerFactory类

    public class StructureMapControllerFactory : DefaultControllerFactory
        {
            protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
            {
                return ObjectFactory.GetInstance(controllerType) as Controller;
            }
        }
    
    4 回复  |  直到 12 年前
        1
  •  1
  •   Community CDub    8 年前
        2
  •  4
  •   revgum    13 年前

    还要注意,如果模型定义了不映射到数据库字段的属性,则可能发生此错误。找到这个问题有点麻烦,所以我会留下答案,以防其他人遇到同样的问题。

    我的修复很简单,包括数据注释:

    using System.ComponentModel.DataAnnotations;
    

    然后在特定属性上使用notmapped注释:

    [NotMapped]
    public string SomeCustomProperty { get; set; }
    
        3
  •  1
  •   phil soady    12 年前

    为了那些寻找原因的人

    值不能为空。参数名称:键

    不明原因的肠内异常。 检查其中一个POCO是否使用了不受支持的类型。我对照这张清单查一下POCO。 并非所有类型都可以在实体框架中映射。EF 5

    // MY TESTING WOULD Indicate  SEE // NOT SUPPORTED comment
    
        public const string Boolean = "System.Boolean";
        public const string Byte = "System.Byte";
        public const string ByteArray = "System.Byte[]";
        public const string SByte = "System.SByte";    // NOT SUPPORTED
        public const string Char = "System.Char";     // NOT SUPPORTED
        public const string Decimal = "System.Decimal";
        public const string Double = "System.Double";
        public const string Single = "System.Single";
        public const string Int32 = "System.Int32";
        public const string UInt32 = "System.UInt32";// NOT SUPPORTED
        public const string Int64 = "System.Int64";
        public const string UInt64 = "System.UInt64";// NOT SUPPORTED
        public const string Int16 = "System.Int16";
        public const string UInt16 = "System.UInt16";
        public const string String = "System.String";
        public const string DateTimeOffset = "System.DateTimeOffset";
        public const string DateTime = "System.DateTime";
        public const string Guid = "System.Guid";
        public const string Enum = "System.Enum";
        public const string Type = "System.Type";// NOT SUPPORTED
    

    这份清单并不详尽。但它确实涵盖了一些经常使用的可能引起问题的重要标量类型。

        4
  •  0
  •   MattC    12 年前

    Revgum的答案正是我使用VS2012 MVC和EF5所需要的。EF5中的一个微小变化是[NotMapped]装饰定义在此库中:

    using System.ComponentModel.DataAnnotations.Schema;
    

    (我相信他的图书馆为EF4及以下版本工作,但不要引用我的话)

    另外,请记住,如果模型具有外键关系,如果未正确修饰未映射的字段,则所有子模型都可能导致抛出相同的错误。

    如果您首先使用EF对代码进行反向工程,而不接触模型,那么这就永远不会是一个问题。