contentService.SaveAndPublish not creating new content
Hello! hoping some one here can help me out with this one.
I am migrating our current Umbraco 7 project to Umbraco 8.
We have a custom back office section that uploads a CSV and creates new content from the CSV rows. The code seems to run fine and creates/saves the content. However it does not appear in the back office or in the database when I check.
The controller which has the method below is inheriting from 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;
}
When I check the logs under App_Data it seems to suggest the items are being published.
{"@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"}
There are no errors and can't see any thing obvious when stepping through the code. Does anyone have any suggestions please?
Edit: Another strange behaviour I have just noticed with line
var result = service.SaveAndPublish(vehicle);
Will give the content an ID. I have let the code run and "create" the content and the first result had an ID of 48863. Although I am unable to see this in the DB or Umbraco.
I have then closed and restarted the project and run the same code using the same CSV. This time I was given an ID of 48873. Incremented by the exact record length of the last upload. So it appears that a record of the ID's is kept somewhere although I can't find. (This could be a red herring on the original issue however 😂ðŸ˜)
First thought, is this import running in a hang fire task or somewhere outside of the Web project and you've somehow got your old v7 database connection string in play? - so it's working but not adding them to the v8 database where you are expecting to see them??
The getting the Id does sort of imply its inserting somewhere!
The import and entire project is being built in a separate project from the original v7 solution so there should be no references to the old v7 database.
The id part I am finding very confusing as you said it is keeping track somewhere, but I have queried the tables in the database and can't find any the records
"As far as I can see, you're not "committing" the changes made in your scope, which might be why you're seeing things being created - they are likely getting rolled back again.
So if you add something like scope.Complete() right after the foreach, it might do the trick?"
contentService.SaveAndPublish not creating new content
Hello! hoping some one here can help me out with this one.
I am migrating our current Umbraco 7 project to Umbraco 8.
We have a custom back office section that uploads a CSV and creates new content from the CSV rows. The code seems to run fine and creates/saves the content. However it does not appear in the back office or in the database when I check.
The controller which has the method below is inheriting from UmbracoAuthorizedApiController
When I check the logs under App_Data it seems to suggest the items are being published.
There are no errors and can't see any thing obvious when stepping through the code. Does anyone have any suggestions please?
Edit: Another strange behaviour I have just noticed with line
Will give the content an ID. I have let the code run and "create" the content and the first result had an ID of 48863. Although I am unable to see this in the DB or Umbraco.
I have then closed and restarted the project and run the same code using the same CSV. This time I was given an ID of 48873. Incremented by the exact record length of the last upload. So it appears that a record of the ID's is kept somewhere although I can't find. (This could be a red herring on the original issue however 😂ðŸ˜)
Hi Frank
First thought, is this import running in a hang fire task or somewhere outside of the Web project and you've somehow got your old v7 database connection string in play? - so it's working but not adding them to the v8 database where you are expecting to see them??
The getting the Id does sort of imply its inserting somewhere!
Regards
Marc
Hey Marc,
Thanks for the reply!
The import and entire project is being built in a separate project from the original v7 solution so there should be no references to the old v7 database.
The id part I am finding very confusing as you said it is keeping track somewhere, but I have queried the tables in the database and can't find any the records
Thanks Frank
Just got the solution! courtesy of Jannik Anker over on Stack Overflow https://stackoverflow.com/questions/75897698/contentservice-saveandpublish-not-creating-new-content-programmatically-umbrac
"As far as I can see, you're not "committing" the changes made in your scope, which might be why you're seeing things being created - they are likely getting rolled back again.
So if you add something like scope.Complete() right after the foreach, it might do the trick?"
awesome!, sorry I didn't spot! (can see it now :-P)
is working on a reply...