Импорт в Orchard Cms просто импортирует последнюю запись
Я пытаюсь импортировать данные в Orchard CMS. У меня есть пользовательская часть, я переопределил метод импорта в драйвере, и я использую модуль импорта / экспорта.
Я экспортировал некоторые данные из Orchard, чтобы убедиться, что схема XML верна, но при импорте импортируется только последняя запись, независимо от того, какие данные на ней.
Я также зашифровал записи в xml, и единственная импортированная запись - это всегда последняя запись с идентификатором NULL. Таким образом, я могу сказать, что это не проблема действительных или недействительных данных. Все записи действительны, и они будут импортированы, если у них есть идентификатор (который будет заменен следующим автоматически сгенерированным ключом), и они являются последними в наборе.
Никаких ошибок в журналах.
Я использую Orchard 1.7.2.0 из репозитория git.
Я использую SQL Compact в качестве движка БД.
Любая идея, почему она терпит неудачу?
Это часть записи:
public class VehiclePartRecord : ContentPartRecord
{
public virtual string Name { get; set; }
public virtual byte VehicleRole { get; set; }
public virtual string Identification { get; set; }
public virtual string RadioCode { get; set; }
public virtual int StartKm { get; set; }
public virtual string Note { get; set; }
public virtual DateTime StartDate { get; set; }
public virtual DateTime EndDate { get; set; }
public virtual bool Active { get; set; }
}
Это драйвер:
protected override void Importing(VehiclePart part, ImportContentContext context)
{
var name = context.Attribute(part.PartDefinition.Name, "Name");
if (name != null) {
part.Name = name;
}
var vehicleRole = context.Attribute(part.PartDefinition.Name, "VehicleRole");
if (!string.IsNullOrWhiteSpace(vehicleRole)) {
part.VehicleRole = byte.Parse(vehicleRole);
}
var identification = context.Attribute(part.PartDefinition.Name, "Identification");
if (!string.IsNullOrWhiteSpace(identification)) {
part.Identification = identification.TrimEnd();
}
var radioCode = context.Attribute(part.PartDefinition.Name, "RadioCode");
if (!string.IsNullOrWhiteSpace(radioCode)) {
part.RadioCode = radioCode.TrimEnd();
}
var startKm = context.Attribute(part.PartDefinition.Name, "StartKm");
if (!string.IsNullOrWhiteSpace(startKm)) {
part.StartKm = int.Parse(startKm);
}
var note = context.Attribute(part.PartDefinition.Name, "Note");
if (note != null) {
part.Note = note;
}
var startDate = context.Attribute(part.PartDefinition.Name, "StartDate");
if (!string.IsNullOrWhiteSpace(startDate)) {
part.StartDate = DateTime.Parse(startDate);
}
var endDate = context.Attribute(part.PartDefinition.Name, "EndDate");
if (!string.IsNullOrWhiteSpace(endDate)) {
part.EndDate = DateTime.Parse(endDate);
}
var active = context.Attribute(part.PartDefinition.Name, "Active");
if (!string.IsNullOrWhiteSpace(active)) {
part.Active = bool.Parse(active);
}
}
И это экспортированный файл, который я отредактировал, и я пытаюсь импортировать:
<!--Exported from Orchard-->
<Orchard>
<Recipe>
<Name>Generated by Orchard.ImportExport</Name>
<Author>admin</Author>
<ExportUtc>2013-11-22T11:39:39.9566929Z</ExportUtc>
</Recipe>
<Data>
<Vehicle Id="4" Status="Published">
<VehiclePart Name="Fiat Punto" VehicleRole="2" Identification="EL 999 LV" RadioCode="013" StartKm="0" Note="" StartDate="2008-04-12T00:00:00" EndDate="" Active="true" />
<CommonPart Owner="/User.UserName=admin" CreatedUtc="2013-11-22T10:27:57.7066182Z" PublishedUtc="2013-11-22T10:27:57.7296195Z" ModifiedUtc="2013-11-22T10:27:57.7356199Z" />
</Vehicle>
<Vehicle Id="8" Status="Published">
<VehiclePart Name="Fiat Punto" VehicleRole="2" Identification="EL 888 LV" RadioCode="014" StartKm="0" Note="" StartDate="2009-04-12T00:00:00" EndDate="" Active="true" />
<CommonPart Owner="/User.UserName=admin" CreatedUtc="2013-11-22T10:27:57.7066182Z" PublishedUtc="2013-11-22T10:27:57.7296195Z" ModifiedUtc="2013-11-22T10:27:57.7356199Z" />
</Vehicle>
<Vehicle Id="12" Status="Published">
<VehiclePart Name="Fiat Punto" VehicleRole="2" Identification="EL 777 LV" RadioCode="017" StartKm="0" Note="" StartDate="2010-03-02T00:00:00" EndDate="" Active="true" />
<CommonPart Owner="/User.UserName=admin" CreatedUtc="2013-11-22T10:27:57.7066182Z" PublishedUtc="2013-11-22T10:27:57.7296195Z" ModifiedUtc="2013-11-22T10:27:57.7356199Z" />
</Vehicle>
<Vehicle Id="" Status="Published">
<VehiclePart Name="Fiat Doblò" VehicleRole="2" Identification="DX 444 BL " RadioCode="051" StartKm="0" Note="" StartDate="2010-01-27T00:00:00" EndDate="" Active="true" />
<CommonPart Owner="/User.UserName=admin" CreatedUtc="2013-11-22T10:27:57.7066182Z" PublishedUtc="2013-11-22T10:27:57.7296195Z" ModifiedUtc="2013-11-22T10:27:57.7356199Z" />
</Vehicle>
</Data>
</Orchard>
Отредактировано:
Согласно запросу это код миграции, который создает структуру БД
SchemaBuilder.CreateTable(
"VehiclePartRecord",
table => table
.ContentPartRecord()
.Column<string>("Name", c => c.WithLength(25))
.Column("VehicleRole", DbType.Byte)
.Column<string>("Identification", c => c.WithLength(12))
.Column<string>("RadioCode", c => c.WithLength(5))
.Column<int>("StartKm")
.Column<string>("Note", c => c.WithLength(255))
.Column<DateTime>("StartDate")
.Column<DateTime>("EndDate")
.Column("Active", DbType.Boolean)
);
ContentDefinitionManager.AlterPartDefinition("VehiclePart",
builder => builder.Attachable());
ContentDefinitionManager.AlterTypeDefinition(
"Vehicle",
cfg => cfg
.WithPart("VehiclePart")
.WithPart("CommonPart", p => p.WithSetting("OwnerEditorSettings.ShowOwnerEditor", "false"))
.Creatable(false)
);
1 ответ
Я попробовал код, и проблема в идентификаторе. Идентификатор не должен быть пустым, а также должен выглядеть примерно так: Id="/Identifier=3cf393fcbdea4c4a9e881e74ce177735
С вашим идентификатором у словаря всегда один и тот же ключ, и он переопределяет последний. Я никогда не использовал модуль импорта / экспорта, но думаю, что эти идентификаторы были установлены вами.
Если вы хотите узнать больше об этом, взгляните на строку 81 в DataRecipeHandler.