我一直在尝试使用以下代码块添加新类别:
CategoryInfo category = new CategoryInfo()
{
CategoryID = 999, // manually set
CategoryName = "TestCategory",
CategoryDisplayName = "Test Category",
CategoryEnabled = true,
CategorySiteID = 1
};
CategoryInfoProvider.SetCategoryInfo(category);
这不会抛出任何错误,但它不会将新类别添加到CMS_Category
表。
但是,如果我删除了这一行:CategoryID = 999,
,该类别将保存到系统中,并自动分配CategoryID。
我想手动设置此字段。任何帮助表示赞赏。 (我试图避免创建其他字段来处理这个问题)
答案 0 :(得分:3)
Kentico根据是否设置了主键来决定是保存还是更新对象。因此,如果设置了CategoryID
,系统实际上会调用UPDATE CMS_Category SET ... WHERE CategoryID = @CategoryID
而不是INSERT INTO ...
如果您需要存储原始参考(我猜测您正在尝试存储外部标识符以进行集成),我建议将其存储在单独的字段中。为了防止修改系统字段,我使用了代码名称字段 - CategoryName
。
虽然@martin的建议似乎是一个好主意,但我很确定它不会起作用,因为Kentico会失去对当前正在更新的对象的引用。如果您拥有有效的源代码许可,请查看CategoryInfoProvider.SetCategoryInfoInternal()
以查看我正在谈论的内容。
答案 1 :(得分:0)
我没有尝试过,但您可以尝试在创建后更改类别的ID,例如:
[CustomCategoryID]
public partial class CMSModuleLoader
{
private class CustomCategoryID : CMSLoaderAttribute
{
public override void Init()
{
CategoryInfo.TYPEINFO.Events.Insert.After += Insert_After;
}
void Insert_After(object sender, CMS.DataEngine.ObjectEventArgs e)
{
var category = e.Object as CategoryInfo;
if (category != null)
{
category.CategoryID = 999, // manually set
category.Update();
}
}
}
}