Почему этот модуль Orchard (1.3.10) не замечает внесенные в него изменения? - PullRequest
0 голосов
/ 01 марта 2012

Я следую этому уроку здесь: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1 Но у меня проблемы с частью 4: http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-4 С одним предупреждением я пишу код в VB.Net.С учетом вышесказанного я завершил часть 3 и смог создать новый модуль (просто добавив простую библиотеку классов), а Орчард распознал и включил его.Однако в части 4, когда я создаю классы Migrations, ProductPart и ProductRecord, ничего не происходит.Я не получаю уведомления о том, что модуль был изменен.

По общему признанию, я не делал лямбды в VB.net до сегодняшнего дня, и также я впервые пробую Авто Свойства в VB.Net также.Но так как не было ошибок времени компиляции, я предполагаю, что написал код правильно.

Вот мой код для 3 файлов:

Imports Orchard.ContentManagement.Records

Namespace Orchard.Webshop
    Public Class ProductRecord
        Inherits ContentPartRecord

        Public Overridable Property Price() As Decimal

        Public Overridable Property Sku() As String
    End Class
End Namespace


Imports Orchard.ContentManagement

Namespace Orchard.Webshop
    Public Class ProductPart
        Inherits ContentPart(Of ProductRecord)

        Public Property Price() As Decimal
            Get
                Return Record.Price
            End Get
            Set(value As Decimal)
                Record.Price = value
            End Set
        End Property

        Public Property Sku() As String
            Get
                Return Record.Sku
            End Get
            Set(value As String)
                Record.Sku = value
            End Set
        End Property
    End Class
End Namespace


Imports Orchard.Data.Migration
Imports Orchard.Core.Contents.Extensions
Imports Orchard.ContentManagement.MetaData

Namespace Orchard.Webshop
    Public Class Migrations
        Inherits DataMigrationImpl

        Public Function Create()

            SchemaBuilder.CreateTable("ProductRecord", Function(table)
                                                           table.ContentPartRecord() _
                                                               .Column(Of Decimal)("Price") _
                                                               .Column(Of String)("Sku", Function(column)
                                                                                             column.WithLength(50)
                                                                                         End Function)
                                                       End Function)
            Return 1
        End Function

        Public Function UpdateFrom1()

            ContentDefinitionManager.AlterPartDefinition(GetType(ProductPart).Name, Function(part)
                                                                                        part.Attachable()
                                                                                    End Function)
            Return 2
        End Function
    End Class
End Namespace

1 Ответ

1 голос
/ 01 марта 2012

Глядя на исходный код Orchard, для быстрого ознакомления браузер исходного кода codeplex

Класс Orchard.Data.Migration.DataMigrationManager использует отражение над всеми внедренными классами IDataMigration и вызывает следующий метод

/// <summary>
/// Returns the Create method from a data migration class if it's found
/// </summary>
private static MethodInfo GetCreateMethod(IDataMigration dataMigration) {
    var methodInfo = dataMigration.GetType().GetMethod("Create", BindingFlags.Public | BindingFlags.Instance);
    if(methodInfo != null && methodInfo.ReturnType == typeof(int)) {
        return methodInfo;
    }
    return null;
}

Кажется, что ваша функция VB не имеет ReturnType, поэтому я считаю, что она должна работать, когда вы пишете свой метод как

Public Function Create() As Integer
    // do stuff
    Return 1;
End Function

Public Function UpdateFrom1() As Integer
    // do stuff
    Return 2;
End Function
...