这是我的迁移代码:
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; }
}
关于我在哪里出错的任何线索?谷歌一无所获。
答案 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设置为记录的主键)