调用存储库GetById时自定义模块中的dal2 linq错误

时间:2013-12-16 17:23:39

标签: dotnetnuke dotnetnuke-module dotnetnuke-7

我正在构建一个简单的自定义模块,但在使用DAL2 GetById时遇到了问题。

以下是我正在使用的表的POCO声明:

<TableName("KrisisStore_Products")> _    
<PrimaryKey("ProductId", AutoIncrement:=True)> _
<Cacheable("Products", CacheItemPriority.Default, 20)> _
<Scope("PortalId")>
Public Class Product

    Public Property ProductId As Int64
    Public Property PortalId As Integer
    Public Property ModuleId As Integer
    ''other columns here

End Class 

我试图使用以下内容从数据库中删除记录(为清楚起见,我删除了其他方法):

在模块视图中:

  Dim pc As New ProductController
  pc.DeleteItem(e.CommandArgument, PortalId)

这是我的产品控制器:

Imports System.Collections.Generic
Imports DotNetNuke.Data

Namespace Components

    Public Class ProductController

        Public Sub DeleteItem(ByVal itemId As Integer, ByVal PortalId As Integer)
            Dim _item As Product = GetItem(itemId, PortalId)
            DeleteItem(_item)
        End Sub

        Public Sub DeleteItem(ByVal p As Product)
            Using ctx As IDataContext = DataContext.Instance()
                Dim rep As IRepository(Of Product) = ctx.GetRepository(Of Product)()
                rep.Delete(p)
            End Using
        End Sub

        Public Function GetItem(ByVal itemId As Integer, ByVal PortalId As Integer) As Product
            Dim p As Product

            Using ctx As IDataContext = DataContext.Instance()
                Dim rep As IRepository(Of Product) = ctx.GetRepository(Of Product)()
                p = rep.GetById(Of Int32, Int32)(itemId, PortalId)
            End Using
            Return p
        End Function
    End Class
End Namespace

问题:

当代码到达GetITem函数中的以下行

  

p = rep.GetById(Int32,Int32)(itemId,PortalId)

生成以下错误:

  

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

以下是堆栈跟踪的更多细节:

InnerException: Value cannot be null. Parameter name: source
FileName:
FileLineNumber: 0
FileColumnNumber: 0
Method: System.Linq.Enumerable.SingleOrDefault
StackTrace:
Message: DotNetNuke.Services.Exceptions.ModuleLoadException: Value cannot be null. Parameter name: source ---> System.ArgumentNullException: Value cannot be null. Parameter name: source at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate) at DotNetNuke.Data.RepositoryBase`1.GetById[TProperty,TScopeType](TProperty id, TScopeType scopeValue) at Krisis.Modules.KrisisStore.Components.ProductController.GetItem(Int32 itemId, Int32 PortalId) in C:\websites\dnndev.me\DesktopModules\KrisisStore\Components\ProductController.vb:line 51

问题

有人可以帮我弄清楚为什么会生成这个linq错误,传递给函数的值是有效的,而其他存储库函数(如GetItems)在提供portalID作为其范围时可以正常工作。

2 个答案:

答案 0 :(得分:3)

在模型类中,您将ProductId定义为Int64,但在控制器方法中,它将作为Integer或Int32传递。您会认为这不重要,但我遇到其他问题,PetaPoco需要非常具体的实施才能正常工作。也许这是一个问题?

答案 1 :(得分:0)

乍一看,看起来查询会带回多条记录。是否可以有多个具有该ID的产品行?