nopCommerce插入实体失败

时间:2012-09-16 20:43:05

标签: asp.net-mvc-3 entity-framework nopcommerce

我正在为类别的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);
    }

2 个答案:

答案 0 :(得分:0)

你的代码似乎很好,这里似乎没问题。我说你的InsertCategory方法有问题,很可能没有使用id。这只是一个猜测...如果这不是答案,也许你可以告诉我们你拥有的东西。

答案 1 :(得分:0)

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

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

this.Property(c=>c.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None) ;