2

我正在为类别创建从 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”;列不允许空值。插入失败。该语句已终止。但即使在调试器中,类别 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);
    }
4

2 回答 2

0

我刚刚发现,我需要更改映射类和数据库,从 ID 中删除自动编号选项。那是另一个痛苦,但解决方案是:

而不是this.HasKey(c=>c.Id)使用:

this.Property(c=>c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) ;
于 2012-09-17T19:04:21.837 回答
0

您的代码似乎很好,这里显示似乎还可以。我会说您的 InsertCategory 方法有问题,该方法很可能没有使用 id。这只是一个猜测......如果这不是答案,也许你可以让我们知道你在它下面有什么。

于 2012-09-16T23:49:09.470 回答