ContentService.SaveAndPublish не создает новый контент программно — Umbraco 8

надеюсь, что кто-то здесь может помочь мне с этим.

Я переношу наш текущий проект 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Насколько я вижу, вы не «фиксируете» изменения, внесенные в вашу область действия, и, возможно, поэтому вы видите, что что-то создается — они, вероятно, снова откатываются.

Итак, если вы добавите что-то вроде scope.Complete() сразу после foreach, это может помочь?

https://our.umbraco.com/apidocs/v8/csharp/api/Umbraco.Core.Scoping.IScope.html#Umbraco_Core_Scoping_IScope_Events

Это только что сработало! Большое спасибо за вашу помощь в этом вопросе :)

Frank-Medium 03.04.2023 17:34

Другие вопросы по теме