使用Orchard CMS在迁移中创建新的内容项

时间:2013-05-21 00:03:03

标签: nhibernate orchardcms-1.6

这是我的迁移代码:

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一对一属性中分配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; }
}

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

2 个答案:

答案 0 :(得分:4)

好的,所以你要创建一个contentpartrecord,而不是那里的内容项。你想要的是更多的东西:

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);

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

答案 1 :(得分: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附加到您的类别内容项目。不确定是否需要placement.info,但无论如何都会添加它以保持一致性。)

如果您打算使用附加到内容项的零件,则不能将其中任何一个留出。

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