是否可以将类别 ID 值分配给类别信息对象

本文关键字:分配 信息 对象 ID 是否 | 更新日期: 2023-09-27 18:31:49

我一直在尝试使用以下代码块添加新类别:

CategoryInfo category = new CategoryInfo()
{
    CategoryID = 999, // manually set
    CategoryName = "TestCategory",
    CategoryDisplayName = "Test Category",
    CategoryEnabled = true,
    CategorySiteID = 1
};
CategoryInfoProvider.SetCategoryInfo(category);

这不会引发任何错误,但不会将新类别添加到表中CMS_Category

但是,如果我删除了这一行:CategoryID = 999,,类别将保存到系统中,并且会自动分配类别ID。

我想手动设置此字段。任何帮助,不胜感激。(我试图避免创建其他字段来处理这个问题)

是否可以将类别 ID 值分配给类别信息对象

Kentico 根据是否设置主键来决定是保存还是更新对象。因此,如果设置了CategoryID,系统实际上会调用UPDATE CMS_Category SET ... WHERE CategoryID = @CategoryID而不是INSERT INTO ...

如果您需要存储原始引用(我猜您正在尝试存储外部标识符以进行集成),我建议您将其存储在单独的字段中。为了防止修改系统字段,我会使用代码名称字段 - CategoryName .

尽管@martin建议的内容似乎是一个好主意,但我很确定它不会起作用,因为 Kentico 会丢失对当前正在更新的对象的引用。如果您有有效的源代码许可证,请查看CategoryInfoProvider.SetCategoryInfoInternal()以了解我在说什么。

我还没有尝试过,但您可以在创建后尝试更改类别的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(); 
        } 
    } 
} 
} 
  • 确定系统不存储您的新类别,而是使用不同的 ID(您提供的)?
  • 你能告诉我你为什么要自定义对象ID行为吗?谢谢