我正在为类别的XML函数创建导入。 首先,使用XDocument创建要添加的类别列表。我在Categories表中关闭了ID的isIdentity选项,因为我打算使用XML中的ID。
XML示例:
<cat>
<id>17</id>
<name>Category name</name>
<parent_id>0</parent_id>
</cat>
然后,我编写了方法,尝试通过ID获取类别并更新,或插入新的:
var category = _categoryService.GetCategoryById(Id);
if (category != null)
{
category.Name = model.Name;
category.ParentCategoryId = model.ParentCategoryId;
category.UpdatedOnUtc = DateTime.UtcNow;
category.Published = true;
category.Deleted = false;
_categoryService.UpdateCategory(category);
}
else
{
category = new Core.Domain.Catalog.Category();
category.Id = model.Id;
category.ParentCategoryId = model.ParentCategoryId;
category.Name = model.Name;
category.UpdatedOnUtc = DateTime.UtcNow;
category.CreatedOnUtc = DateTime.UtcNow;
category.Published = true;
category.Deleted = false;
_categoryService.InsertCategory(category);
}
然后是最奇怪的 - 应用程序抛出异常:无法将值NULL插入列'Id',表'nopCommerce.dbo.Category';列不允许空值。 INSERT失败。 该语句已终止。 但即使在调试器中,类别ID也不为空..请求帮助! 提前谢谢!
更新:InsertCategory是一种标准的nopCommerce方法:
/// <summary>
/// Inserts category
/// </summary>
/// <param name="category">Category</param>
public virtual void InsertCategory(Category category)
{
if (category == null)
throw new ArgumentNullException("category");
_categoryRepository.Insert(category);
//cache
_cacheManager.RemoveByPattern(CATEGORIES_PATTERN_KEY);
_cacheManager.RemoveByPattern(PRODUCTCATEGORIES_PATTERN_KEY);
//event notification
_eventPublisher.EntityInserted(category);
}
答案 0 :(得分:0)
你的代码似乎很好,这里似乎没问题。我说你的InsertCategory方法有问题,很可能没有使用id。这只是一个猜测...如果这不是答案,也许你可以告诉我们你拥有的东西。
答案 1 :(得分:0)
我刚刚发现,我需要更改映射类和数据库,从ID中删除自动编号选项。这是另一个痛苦,但解决方案是:
而不是this.HasKey(c=>c.Id)
使用:
this.Property(c=>c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) ;