2

OrchardCMS 開発者/ユーザー、

私は持っている

public class MyContentPartRecord : ContentPartRecord
{ ... }

に変更したい

public class MyContentPartRecord : ContentPartVersionRecord
{ ... }

この部分の下書きを作成できるようにするため。

マイグライオンに追加

SchemaBuilder.AlterTable(
            "MyContentPartRecord",
            table =>
            table
                .AddColumn<int>("ContentItemRecord_id")
            );

アプリを実行すると、MyContentPart のコンテンツ アイテムが取得され、空の公開バージョンが作成されます。

MyContentPartRecord テーブルのデータベース:

Id  [..fields..]    ContentItemRecord_Id
657 NULL,..         67
67  'MYDATA',...    NULL

有効な下書き可能な MyContentPart を作成するには?

アップデート。私は追加しようとしましたが成功しませんでした:

SchemaBuilder.ExecuteSql(@"
    UPDATE       MyContentPartRecord 
    SET                ContentItemRecord_id = t2.ContentItemRecord_id 
    from MyContentPartRecord t1 inner join Orchard_Framework_ContentItemVersionRecord t2 on t1.id= t2.id
");

ContentItemRecord_id が設定されていないため、orchard は MyContentPartRecord テーブルの古いレコードを処理できないようです。

4

3 に答える 3

0

Piotr の助けを借りて、ここに解決策があります。入れるものは次のとおりMigrations.csです。

SchemaBuilder.AlterTable(
                "MyContentPart",
                table =>
                table
                    .AddColumn<int>("ContentItemRecord_id")
                );

            SchemaBuilder.ExecuteSql(@"
ALTER TABLE MyModuleName_MyContentPart
DROP CONSTRAINT PK__MyModuleName_W__3214EC072C83793F
");
            SchemaBuilder.ExecuteSql(@"
INSERT INTO MyModuleName_MyContentPart
                         (Id, ContentItemRecord_id, Field1, Field2)
SELECT        t3.Id AS id, t2.Id AS ContentItemRecord_id, t2.Field1, t2Field2
FROM            MyModuleName_MyContentPart AS t2 LEFT OUTER JOIN
                         Orchard_Framework_ContentItemVersionRecord AS t3 ON t2.Id = t3.ContentItemRecord_id
WHERE        (t3.Latest = 1) AND (NOT (t3.Id IS NULL))
");
            SchemaBuilder.ExecuteSql(@"
DELETE FROM MyModuleName_MyContentPart
WHERE ContentItemRecord_id is NULL
");
            SchemaBuilder.ExecuteSql(@"
ALTER TABLE MyModuleName_MyContentPart
ADD CONSTRAINT PK_MyModuleName_MyContentPart_ID PRIMARY KEY (Id)
");

アップデート。

最終的な解決策:

SchemaBuilder.AlterTable(
                "MyContentPart",
                table =>
                table
                    .AddColumn<int>("ContentItemRecord_id")
                );

            SchemaBuilder.ExecuteSql(@"
ALTER TABLE MyModuleName_MyContentPart
DROP CONSTRAINT PK__MyModule_W__3214EC072C83793F
");
            SchemaBuilder.ExecuteSql(@"
INSERT INTO MyModuleName_MyContentPart
 (Id, ContentItemRecord_id, Field1)
SELECT V.Id as Id
       ,T.Id as ContentItemRecord_id 
      ,Field1
FROM  [MyModuleName_MyContentPart] T
    LEFT OUTER JOIN
        Orchard_Framework_ContentItemVersionRecord AS V ON V.ID in
            (select top(1) Id 
                from Orchard_Framework_ContentItemVersionRecord 
                where ContentItemRecord_id = T.ID 
                order by latest desc, id desc)
");
            SchemaBuilder.ExecuteSql(@"
DELETE FROM MyModuleName_MyContentPart
WHERE ContentItemRecord_id is NULL
");
            SchemaBuilder.ExecuteSql(@"
ALTER TABLE MyModuleName_MyContentPart
ADD CONSTRAINT PK_MyModuleName_MyContentPart_ID PRIMARY KEY (Id)
");
        }
于 2013-05-20T11:29:17.290 に答える
0

@Artjom と @PiotrSzmyd のソリューションに基づいて、migration.cs ファイルに入れることができるより一般的なソリューションを次に示します。このソリューションは、自動的に生成された主キーがモジュールのユーザーごとに異なる名前になる可能性があるという事実を処理します。また、ユーザーがグローバル データベース プレフィックスを定義している場合 (マルチテナントを使用している場合など)、テーブル名にプレフィックスを付けることができます。

    // Manually add the column that is required for the part to be a ContentPartVersionRecord
    SchemaBuilder.AlterTable("MyCustomPartRecord", table => table.AddColumn<int>("ContentItemRecord_id"));

    // Get table name
    var tablePrefix = String.IsNullOrEmpty(_shellSettings.DataTablePrefix) ? "" : _shellSettings.DataTablePrefix + "_";
    var tableName = tablePrefix + "MyModule_MyCustomPartRecord";

    // Drop the primary key
    SchemaBuilder.ExecuteSql(string.Format(@"
        DECLARE @primaryKeyName NVARCHAR(MAX)

        SELECT @primaryKeyName = constraint_name
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
        WHERE CONSTRAINT_TYPE = 'Primary Key' and TABLE_NAME = '{0}'                

        EXEC(N'ALTER TABLE {0} DROP CONSTRAINT ' + @primaryKeyName)
    ", tableName));

    // Migrate IDs to ContentItemRecord_id
    SchemaBuilder.ExecuteSql(string.Format(@"
        INSERT INTO {0} (Id, ContentItemRecord_id, Category_Id, ItemCode, Name, Description, DisplayOrder, Location, MaintenanceFrequency, MaintenanceFrequencyMultiplier, MaintenanceStartDate, Notes, IsEnabled)
        SELECT V.Id as Id, T.Id as ContentItemRecord_id, Category_Id, ItemCode, Name, Description, DisplayOrder, Location, MaintenanceFrequency, MaintenanceFrequencyMultiplier, MaintenanceStartDate, Notes, IsEnabled
        FROM {0} T
        LEFT OUTER JOIN
        {1}Orchard_Framework_ContentItemVersionRecord AS V ON V.ID in
            (select top(1) Id 
                from {1}Orchard_Framework_ContentItemVersionRecord 
                where ContentItemRecord_id = T.ID 
                order by latest desc, id desc)
    ", tableName, tablePrefix));

    // Remove old rows (no ContentItemRecord_id value)
    SchemaBuilder.ExecuteSql(string.Format(@"
        DELETE FROM {0}
        WHERE ContentItemRecord_id is NULL
    ", tableName));

    // Re-add the primary key
    SchemaBuilder.ExecuteSql(string.Format(@"
        ALTER TABLE {0}
        ADD CONSTRAINT PK_{0}_Id PRIMARY KEY (Id)
    ", tableName));
于 2013-09-10T11:21:07.940 に答える