Ошибка dal2 linq в пользовательском модуле при вызове репозитория GetById

У меня есть простой настраиваемый модуль, который я создаю, но столкнулся с проблемой при использовании 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)

Возникает следующая ошибка:

Значение не может быть нулевым. Имя параметра: источник

Вот немного больше деталей из трассировки стека:

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, работают правильно, если в качестве области их действия указан идентификатор портала.


person J King    schedule 16.12.2013    source источник


Ответы (2)


В классе модели вы определили ProductId как Int64, но в методах вашего контроллера он передается как Integer или Int32. Вы могли бы подумать, что это не имеет значения, но я сталкивался с другими проблемами, когда PetaPoco требует очень специфической реализации для правильной работы. Возможно, это проблема?

person DotNetNuclear    schedule 17.12.2013
comment
Потрясающе. Спасибо. Это был не единственный столбец, в котором у меня были разные сопоставления int между базой данных и классом модели. Как только я исправил сопоставления, чтобы они соответствовали базе данных в моем классе модели, ошибка была устранена. - person J King; 17.12.2013

На первый взгляд кажется, что запрос возвращает несколько записей. Может ли быть более одной строки продукта с этим идентификатором?

person bdukes    schedule 16.12.2013