У меня возникла проблема с импортом определенного типа контента. Если я экспортирую один элемент и затем импортирую его обратно, он не только не соответствует, но и обновляет существующий элемент, он даже создает второй, полностью пустой элемент.Несколько элементов, созданных при импорте одного элемента контента в Orchard 1.10.1
Screenshot of duplicate content item.
Я использую пользовательское свойство идентификации внутри части содержимого, что может быть проблемой, но я бы подумал, что даже если он не может соответствовать существующему элементу, он не должен создавать пустые элементы контента.
Обработчик части перекрывает GetItemMetadata добавить тождество:
protected override void GetItemMetadata(GetContentItemMetadataContext context)
{
var part = context.ContentItem.As<ProductPart>();
if (part != null)
{
context.Metadata.Identity.Add("PartNumber", part.PartNumber);
}
}
импортирующей и экспортирующей функции определяются следующим образом в драйвере:
protected override void Importing(ProductPart part, ImportContentContext context)
{
// Don't do anything if the tag is not specified.
if (context.Data.Element(part.PartDefinition.Name) == null)
{
return;
}
context.ImportAttribute(part.PartDefinition.Name, "PartNumber", partNumber =>
part.PartNumber = partNumber
);
}
protected override void Exporting(ProductPart part, ExportContentContext context)
{
context.Element(part.PartDefinition.Name).SetAttributeValue("PartNumber", part.PartNumber);
}
Это экспортированный XML I Используется для тестирования:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!--Exported from Orchard-->
<Orchard>
<Recipe>
<ExportUtc>2016-07-26T14:03:45.9022599Z</ExportUtc>
</Recipe>
<Content>
<Product Id="/PartNumber=BMF 20 20 30" Status="Published">
<EnumerationField.Units Value="Metric" />
<NumericField.InnerDiameter Value="0.19" />
<NumericField.Length Value="0.185" />
<NumericField.OuterDiameter Value="0.5" />
<TaxonomyField.ProductRange Terms="/alias=taxonomies\/product-ranges\/oilite/Identifier=/Reference=oilite" />
<TaxonomyField.ProductType Terms="/alias=taxonomies\/product-types\/plain/Identifier=/Reference=plain" />
<CommonPart Owner="/User.UserName=admin" CreatedUtc="2016-07-26T14:03:27.8841625Z" PublishedUtc="2016-07-26T14:03:27.9597274Z" ModifiedUtc="2016-07-26T14:03:27.9547403Z" />
<ProductPart PartNumber="BMF 20 20 30" />
</Product>
</Content>
</Orchard>
Все объекты, кроме Пар. tNumber определены как поля, поэтому PartNumber - это единственное, что входит в свою собственную таблицу в базе данных.
Полное определение для части выглядит следующим образом:
SchemaBuilder.CreateTable("ProductPartRecord", table => table
.ContentPartRecord()
.Column<string>("PartNumber", column => column
.WithLength(50)
)
);
ContentDefinitionManager.AlterPartDefinition("ProductPart", builder => builder
.Attachable()
.WithDescription("Turns a content type into a Product with a Part Number."));
ContentDefinitionManager.AlterPartDefinition("ProductPart", builder => builder
.WithField("ProductRange", cfg => cfg
.OfType("TaxonomyField")
.WithDisplayName("Material/Range")
.WithSetting("TaxonomyFieldSettings.Taxonomy", "Product Ranges")
.WithSetting("TaxonomyFieldSettings.LeavesOnly", "True")
.WithSetting("TaxonomyFieldSettings.Required", "True")
.WithSetting("TaxonomyFieldSettings.SingleChoice", "True")
.WithSetting("TaxonomyFieldSettings.Autocomplete", "False")
.WithSetting("TaxonomyFieldSettings.AllowCustomTerms", "False")
)
.WithField("ProductType", cfg => cfg
.OfType("TaxonomyField")
.WithDisplayName("Type/Form")
.WithSetting("TaxonomyFieldSettings.Taxonomy", "Product Types")
.WithSetting("TaxonomyFieldSettings.LeavesOnly", "True")
.WithSetting("TaxonomyFieldSettings.Required", "True")
.WithSetting("TaxonomyFieldSettings.SingleChoice", "True")
.WithSetting("TaxonomyFieldSettings.Autocomplete", "False")
.WithSetting("TaxonomyFieldSettings.AllowCustomTerms", "False")
)
.WithField("Units", cfg => cfg
.OfType("EnumerationField")
.WithDisplayName("Units")
.WithSetting("EnumerationFieldSettings.Required", "True")
.WithSetting("EnumerationFieldSettings.Options", "Metric\r\nImperial")
.WithSetting("EnumerationFieldSettings.ListMode", "Radiobutton")
)
.WithField("InnerDiameter", cfg => cfg
.OfType("NumericField")
.WithDisplayName("Inner Diameter")
.WithSetting("NumericFieldSettings.Scale", "3")
)
.WithField("OuterDiameter", cfg => cfg
.OfType("NumericField")
.WithDisplayName("Outer Diameter")
.WithSetting("NumericFieldSettings.Scale", "3")
)
.WithField("Length", cfg => cfg
.OfType("NumericField")
.WithDisplayName("Length")
.WithSetting("NumericFieldSettings.Scale", "3")
)
.WithField("Thickness", cfg => cfg
.OfType("NumericField")
.WithDisplayName("Thickness")
.WithSetting("NumericFieldSettings.Scale", "3")
)
.WithField("Width", cfg => cfg
.OfType("NumericField")
.WithDisplayName("Width")
.WithSetting("NumericFieldSettings.Scale", "3")
)
.WithField("SurfaceStyle", cfg => cfg
.OfType("EnumerationField")
.WithDisplayName("Surface Style")
.WithSetting("EnumerationFieldSettings.Options", "\r\nPlain\r\nSmooth\r\nHoles\r\nDiamond Pockets\r\nRound Pockets")
.WithSetting("EnumerationFieldSettings.ListMode", "Dropdown")
)
.WithField("BackingMaterial", cfg => cfg
.OfType("EnumerationField")
.WithDisplayName("Backing Material")
.WithSetting("EnumerationFieldSettings.ListMode", "Dropdown")
.WithSetting("EnumerationFieldSettings.Options", "\r\nMild Steel\r\nBronze Backing")
)
);
Любая помощь будет принята с благодарностью!
Какие еще у вас есть запчасти к виду продукции? –
Извинения за медленный отклик. Единственная другая часть - общая часть. – JimUrban
Вы реализовали 'IIdentityResolverSelector' для вашего' PartNumber'? –