值不能为 null。参数名: key。

6

值不能为空。参数名: key

自从我将StructureMapControllerFactory作为我的DefaultControllerFactory实现后,我开始出现这个错误。

实际上,我是从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;
        }
    }

它出现在哪里?完整的堆栈跟踪是什么?这些重要信息有助于调试。 - Rex M
我已经发布了堆栈跟踪...谢谢。 - Barbaros Alp
4个回答

5

请注意,如果一个模型定义了属性,而这些属性不映射到数据库字段,则可能会出现此错误。要解决这个问题有点麻烦,所以我将在SO上留下答案,以防其他人遇到同样的问题。

我的解决方法很简单,包含DataAnnotations:

using System.ComponentModel.DataAnnotations;

然后在特定的属性上使用NotMapped注释:
[NotMapped]
public string SomeCustomProperty { get; set; }

2

谢谢。如果controllerType为空,我只是返回null,它能正常工作。 - Barbaros Alp

1

对于那些寻找为什么会出现未解释异常的人

值不能为空。参数名: key

请检查是否有一个POCO使用了不受支持的类型。我会根据这个列表检查POCO 并非所有类型都可以在实体框架中映射。截至EF 5.0版本。

// 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

这个列表并不详尽,但它涵盖了一些常用的标量类型,可能会引起问题。


0

Revgum的回答正是我在使用VS2012 MVC和EF5时所需要的。在EF5中有一个小变化,[NotMapped]修饰符的定义在这个库中:

using System.ComponentModel.DataAnnotations.Schema;

(我相信他的库适用于EF4及以下版本,但不要引用我的话)

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

如果您正在使用EF进行反向工程代码,并且不接触模型,则这永远不应该是一个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接