在 Orchard 1.10.1 中导入单个内容项目时创建的多个项目

Multiple items created when importing a single content item in 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:

<?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>

除 PartNumber 之外的所有属性都定义为字段,因此 PartNumber 是数据库中唯一进入其自身 table 的内容。

部分完整定义如下:

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

如有任何帮助,我们将不胜感激!

您需要为您 PartNumber 属性 实施 IIdentityResolverSelector。这将使导入能够正确理解您的新身份。代码中有多个示例可以向您展示方法。