nhibernateorchardcms-1.6

Creating a new Content Item in the migration with Orchard CMS


Here's my migration code:

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 obviously attempts to insert a dummy record, but this causes nHibernate to throw this exception:

"attempted to assign id from null one-to-one property: ContentItemRecord"

The Part Record looks like:

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

Any clues as to where I'm going wrong here? Google produced nothing.


Solution

  • Okay, so you are creating a contentpartrecord, not a content item there. What you want is something more along the lines of:

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

    I think that is how you would do it. Maybe you would want to look into creating content items using the import/export module, that is the more common and safe way to do it.