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 抛出这个异常:

“尝试从空的一对一属性分配 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; }
}

关于我在哪里出错的任何线索?谷歌一无所获。

4

2 回答 2

4

好的,所以您正在创建内容部分记录,而不是那里的内容项。你想要的是更多类似的东西:

var item = _orchardServices.ContentManager.New("Category").As<CategoryPart>();
item.Name = "Bobs Item"; // Something like that...
item.ContentItem.As<TitlePart>().Title = "Yay a title"; // This syntax may be wrong, I'm very tired
_orchardServices.ContentManager.Create(item);
_orchardServices.ContentManager.Publish(item.ContentItem);

我想你会这样做。也许您想研究使用导入/导出模块创建内容项,这是更常见和更安全的方法。

于 2013-05-21T02:28:39.287 回答
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。

如果您在尝试提取部分时得到空值,您可能会遗漏一些东西。为了使它工作,您需要实现 CategoryPart、CategoryPartRecord、CategoryPartHandler 和 CategoryPartDriver。(当然,请确保将您的 CategoryPart 附加到您的 Category 内容项。不确定是否需要placement.info,但无论如何都会添加它以保持一致性。)
如果您打算使用 Part,则不能忽略其中任何一个附加到内容项。

我不确定是否/如何创建没有内容项的部分,但您可以创建没有部分和内容项的记录(只要确保您没有在记录对象中继承 ContentPartRecord)。如果您只是想添加没有部分或内容项的记录,那么 Ben Power 使用的 UpdateFrom1 中的代码将用于创建记录。(但迁移部分要改,取出内容项和部分,手动设置Id为记录的主键)

于 2014-04-28T06:55:51.317 回答