2

ここに私の移行コードがあります:

public Migrations(IRepository<ProductPartRecord> productPartRepository, IRepository<CategoryPartRecord> categoryPartRepository)
    {
        _productPartRepository = productPartRepository;
        _categoryPartRepository = categoryPartRepository;
    }

    public int Create() {
        ContentDefinitionManager.AlterTypeDefinition("Category", builder => builder
            .WithPart("CommonPart")
            .WithPart("TitlePart")
            .WithPart("AutoroutePart"));

        ContentDefinitionManager.AlterTypeDefinition("Category", builder => builder
            .WithPart("AutoroutePart", partBuilder => partBuilder
                .WithSetting("AutorouteSettings.AllowCustomPattern", "true")
                .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "false")
                .WithSetting("AutorouteSettings.PatternDefinitions", "[{Name:'Category Title', Pattern: 'category/{Content.Slug}', Description: 'category/category-title'}]")));

        SchemaBuilder.CreateTable("CategoryPartRecord", table => table
            .ContentPartRecord()
                .Column<string>("Name")
                .Column<string>("Description")
                .Column<string>("Image")
            );

        ContentDefinitionManager.AlterTypeDefinition("Category", builder => builder
            .WithPart("CategoryPart"));

        ContentDefinitionManager.AlterTypeDefinition("Category", builder => builder
            .Creatable()
            .Draftable());

        return 1;
    }


    public int UpdateFrom1() {

        _categoryPartRepository.Create(new CategoryPartRecord { Name = "Category1", Description = "Description1", Image = "Image1" });

        return 2;
    }

UpdateFrom1 は明らかにダミー レコードを挿入しようとしますが、これにより nHibernate は次の例外をスローします。

「null の 1 対 1 のプロパティから ID を割り当てようとしました: ContentItemRecord」

部品レコードは次のようになります。

public class CategoryPartRecord : ContentPartRecord {
    public CategoryPartRecord()
    {
        CategoryProducts = new List<CategoryProductRecord>();
    }

    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual string Image { get; set; }

    public virtual IList<CategoryProductRecord> CategoryProducts { get; set; }
}

ここでどこが間違っているかの手がかりはありますか?Google は何も生み出しませんでした。

4

2 に答える 2

0

Hazzaからの回答が機能するかどうかはわかりません。それを試していません。私は通常これを行うだけです:(しかし、それが何らかの方法で劣ったアプローチであるかどうかはわかりません)

var item = _orchardServices.ContentManager.New("Category");
var cpart = item.As<CategoryPart>();
var tpart = item.As<TitlePart>();
cpart.Name = "SomeName";
tpart.Title = "SomeTitle";
_orchardServices.ContentManager.Create(item);

しかし、ローレンス・ジョンソンのコメントに対処するには:

この場合のカテゴリはコンテンツ アイテムです。彼は新しい Category コンテンツ アイテムを作成し、そこから対応する CategoryPart を抽出しています。

部分を抽出しようとしたときに null を取得している場合は、おそらく何かが欠けています。これを機能させるには、CategoryPart、CategoryPartRecord、CategoryPartHandler、CategoryPartDriver を実装する必要があります。(もちろん、CategoryPart を必ず Category コンテンツ アイテムに添付してください。placement.info が必要かどうかは定かではありませんが、一貫性を保つために追加します。)
Part を使用する予定がある場合は、これらを除外することはできません。コンテンツ アイテムに添付されます。

コンテンツ アイテムのないパーツを作成できるかどうか、またはどのように作成できるかはわかりませんが、パーツもコンテンツ アイテムもないレコードを作成できます (レコード オブジェクトで ContentPartRecord を継承しないようにしてください)。パーツやコンテンツ アイテムを含まないレコードを追加するだけの場合は、Ben Power が使用する UpdateFrom1 のコードを使用してレコードを作成できます。(ただし、移行部分を変更して、コンテンツ アイテムと部分を取り出し、ID をレコードの主キーに手動で設定する必要があります)

于 2014-04-28T06:55:51.317 に答える