3

我正在尝试创建一个命令行快速程序来一次性将用户从旧系统(非 DNN)导入到新系统。但是,NullReferenceException在以下代码行中抛出了 a:

        var user = new UserInfo();
        user.PortalID = portalId;
        user.FirstName = firstName;

最后一行是发生异常的地方。我知道这段代码在模块中运行时有效,因为它是我正在使用的库的一部分。我想这是错误的,因为UserInfo该类依赖于通常在 Web 环境中设置的信息。

有什么办法可以做到这一点吗?我真的不想让它作为一个在生产站点上运行的模块。

4

1 回答 1

1

您需要配置必要的提供程序才能使用UserControllerUserInfo类。最直接的方法是使用网站的工作配置并将应用程序实现为 DNN 模块。但是您也可以尝试将所需的 DLL 和配置部分从 DNN 站点复制到控制台应用程序,并使用 DNN 源来调试问题。

在这种情况下,源告诉设置UserInfo对象的FirstName属性失败,因为该FirstName属性由配置文件提供程序支持,该配置文件提供程序使用缓存提供程序和数据提供程序进行数据访问。默认情况下,配置文件由DNNProfileProvider使用FileBasedCachingProviderSqlDataProvider来获取配置文件属性和数据的 实现。调用时还会为新UserInfo对象检索配置文件属性定义ProfileController.GetUserProfile。这就是为什么NullReferenceException会被抛出。

DNN 5.6.3 中的相应属性为:

用户信息.vb

<SortOrder(1), MaxLength(50), Required(True)> _
Public Property FirstName() As String
    Get
        Return Profile.FirstName
    End Get
    Set(ByVal Value As String)
        Profile.FirstName = Value
    End Set
End Property

<Browsable(False)> _
Public Property Profile() As UserProfile
    Get
        'implemented progressive hydration
        'this object will be hydrated on demand
        If _Profile Is Nothing Then
            _Profile = New UserProfile
            ProfileController.GetUserProfile(Me)
        End If
        Return _Profile
    End Get
    Set(ByVal Value As UserProfile)
        _Profile = Value
    End Set
End Property
于 2012-05-24T08:36:21.157 回答