надеюсь, что кто-то здесь может помочь мне с этим.
Я переношу наш текущий проект Umbraco 7
в Umbraco 8
.
У нас есть специальный раздел бэк-офиса, который загружает CSV
и создает новый контент из CSV
строк. Код работает нормально и создает/сохраняет контент. Однако, когда я проверяю, он не отображается в бэк-офисе или в базе данных.
Контроллер с указанным ниже методом наследуется от UmbracoAuthorizedApiController
public async Task<HttpResponseMessage> UploadFileToServer()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
//Id for the parent
var vehicleList = Umbraco.Content(2873);
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var file = provider.Contents.First();
var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
_logger.Debug(this.GetType(), $"uploading file {filename}");
var buffer = await file.ReadAsByteArrayAsync();
var stream = new MemoryStream(buffer);
string payload;
using (var s = new StreamReader(stream))
{
var DataReader = new DataReader();
var validateResult = DataReader.Validate(filename, s);
if (validateResult.ImportedOK)
{
_logger.Debug(this.GetType(), $"file {filename} has no duplicates");
IDataTypeService dts = Services.DataTypeService;
var stocklistStatus = dts.GetAll().First(z => z.Name == "StocklistStatus");
var dataType = dts.GetDataType(stocklistStatus.Id);
ValueListConfiguration prevalues =
(ValueListConfiguration)dataType.Configuration;
int pendingstatus = prevalues
.Items
.Where(x => x.Value == "Pending")
.Select(i => i.Id)
.FirstOrDefault();
var service = Services.ContentService;
using (var scope = _scopeProvider.CreateScope())
{
var db = scope.Database;
foreach (var item in validateResult.ImportRows)
{
var cleanedreg = Utility.CleanReg(item.Reg);
var cleanedConverterUsername = item.Converter.TrimStart('0');
var guid = new Guid("e597cb94-727d-44d2-987c-2d6d8e3b73c2");
var vehicle = service
.Create(cleanedreg, guid, "Vehicle", Security.GetUserId()
.Result);
var alreadyExists = ArchiveVehicleDataProvider
.CheckIfVehicleSoldExpiredBefore(db, cleanedreg, _logger);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Colour)
.Alias, item.Colour);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Converter)
.Alias, cleanedConverterUsername);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Doors)
.Alias, item.Doors);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.ElectricBelt)
.Alias, item.ElectricBelt);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Fuel)
.Alias, item.Fuel);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Make)
.Alias, item.Make);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Mileage)
.Alias, item.Mileage);
vehicle
.SetValue(Vehicle.GetModelPropertyType(x => x.Model)
.Alias, item.Model);
vehicle.SetValue(Vehicle
.GetModelPropertyType(x => x.AdditionalInformation)
.Alias, item.Additional);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Price)
.Alias, item.Price);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.Seats)
.Alias, item.Seats);
vehicle
.SetValue(Vehicle
.GetModelPropertyType(x => x.PublishedDate)
.Alias, DateTime.Now);
var result = service.SaveAndPublish(vehicle);
}
}
}
_logger.Debug(this.GetType(), $"file {filename} loaded into database");
payload = JsonConvert.SerializeObject(validateResult);
}
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(payload);
return response;
}
Когда я проверяю журналы под App_Data
, кажется, что элементы публикуются.
{
"@t":"2023-03-30T12:39:46.2787407Z",
"@mt":"Document {ContentName} (id = {ContentId}) has been published.",
"ContentName":"Vehicle123",
"ContentId":0,
"SourceContext":"Umbraco.Core.Services.Implement.ContentService",
"ProcessId":10848,"ProcessName":"iisexpress",
"ThreadId":5,"AppDomainId":2,
"AppDomainAppId":"LMW3SVC2ROOT",
"MachineName":"AT1149",
"Log4NetLevel":"INFO ",
"HttpRequestNumber":3,
"HttpRequestId":"f61e2d8f-71ac-48a9-87ce-e4ed98354c58"
}
Ошибок нет и не видно ничего очевидного при переходе по коду. У кого-нибудь есть предложения, пожалуйста?
Еще одно странное поведение, которое я только что заметил с линией
var result = service.SaveAndPublish(vehicle);
Присвоит содержимому идентификатор. Я запустил код и «создал» контент, и первый результат получил ID
из 48863
. Хотя я не вижу этого в DB
или Umbraco
.
Затем я закрыл и перезапустил проект и запустил тот же код, используя тот же CSV
. На этот раз мне дали ID
из 48873
. Увеличивается на точную длину записи последней загрузки. Получается, что где-то хранится запись ID
, хотя я не могу найти. (Однако это может быть отвлекающим маневром в исходной проблеме)
Импорт и весь проект создаются в отдельном проекте от исходного решения v7, поэтому не должно быть ссылок на старую базу данных v7.
Насколько я вижу, вы не «фиксируете» изменения, внесенные в вашу область действия, и, возможно, поэтому вы видите, что что-то создается — они, вероятно, снова откатываются.
Итак, если вы добавите что-то вроде scope.Complete()
сразу после foreach, это может помочь?
Это только что сработало! Большое спасибо за вашу помощь в этом вопросе :)