Umbraco 8中ContentService.SaveAndPublish无法程序化创建内容
Umbraco 8 CSV导入内容不持久化问题解决
核心问题分析
- 未提交Scope事务:代码中手动创建了数据库Scope,但未调用
scope.Complete(),所有数据库操作会在Scope结束时自动回滚,这是内容无法写入数据库的直接原因。 - 父节点参数错误:创建内容时使用硬编码Guid作为父节点,而非之前获取的
vehicleList节点的合法ID/Key,可能导致内容创建在无效位置。 - 未检查发布结果:没有验证
SaveAndPublish的执行状态,无法及时发现验证、权限类潜在问题。
修复步骤
1. 提交Scope事务
在Scope代码块内,完成所有内容创建与发布后,必须调用scope.Complete()提交事务:
using (var scope = _scopeProvider.CreateScope()) { var db = scope.Database; foreach (var item in validateResult.ImportRows) { // ... 原有内容创建、属性赋值逻辑 ... var result = service.SaveAndPublish(vehicle); // 新增:检查发布结果,记录错误信息 if (!result.Success) { _logger.Error(this.GetType(), $"发布车辆{cleanedreg}失败:{string.Join(", ", result.Errors.Select(e => e.Message))}"); } } // 提交事务,确保数据持久化 scope.Complete(); }
2. 修正父节点参数
将硬编码Guid替换为合法的父节点Key(或ID):
// 原错误代码: // var guid = new Guid("e597cb94-727d-44d2-987c-2d6d8e3b73c2"); // var vehicle = service.Create(cleanedreg, guid, "Vehicle", Security.GetUserId().Result); // 修改为: var parentKey = vehicleList.Key; // 或使用vehicleList.Id,对应Create方法的重载 var vehicle = service.Create(cleanedreg, parentKey, "Vehicle", Security.GetUserId().Result);
注:先确认
Umbraco.Content(2873)能正确获取到父节点,若节点不存在,需检查节点ID是否正确。
3. 补充基础校验
- 确认
Security.GetUserId().Result返回有效用户ID,避免因权限不足导致内容无法保存。 - 核对
Vehicle模型的属性别名与后台文档类型的属性别名完全一致,防止属性赋值失败。
4. 验证日志输出
修复后重新执行导入,查看日志中ContentId是否为非0值,同时检查是否有错误日志输出,确认内容是否正常持久化。
内容的提问来源于stack exchange,提问作者Frank-Medium
相关产品推荐
相关产品推荐

