contentService.SaveAndPublish不以编程方式创建新内容- Umbraco



希望这里有人能帮我解决这个问题。

我正在将我们当前的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。我让代码运行并创建内容和第一个结果的ID48863。虽然我无法在DBUmbraco中看到这一点。

然后我关闭并重新启动项目,并使用相同的CSV运行相同的代码。这次给我的是48873中的ID。以上次上载的确切记录长度递增。所以看起来ID的记录被保存在某个地方,尽管我找不到。(然而,这可能是转移话题)

导入和整个项目是在与原始v7解决方案分开的项目中构建的,因此不应该有对旧v7数据库的引用。

在我看来,你并没有"承诺"。在你的作用域中所做的更改,这可能是你看到正在创建的东西的原因——它们很可能再次被回滚。

所以如果你在foreach之后添加scope.Complete()之类的东西,它可能会奏效?

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

最新更新