2016-01-25 5 views
1

Я пытался добавить новую категорию, используя следующий блок кода:Можно ли присвоить значение CategoryID объекту CategoryInfo?

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

CategoryInfoProvider.SetCategoryInfo(category); 

Это не бросает какую-либо ошибки, но он не добавляет новую категорию в CMS_Category таблицы.

Однако, если я удалил эту строку: CategoryID = 999,, категория будет сохранена в системе и автоматически присвоена категория.

Я хотел бы установить это поле вручную. Любая помощь приветствуется. (я стараюсь избегать создания дополнительных полей справиться с этим)

ответ

0

Я попробовал `t гавани, но вы можете попытаться изменить идентификатор категории после того, как создать, что-то вроде:

[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(); 
     } 
    } 
} 
} 
  • Ты уверен, что система не сохраняет вашу новую категорию, но с другим идентификатором (который вы предоставляете)?
  • Не могли бы вы рассказать мне, почему вы хотите настроить поведение идентификатора объекта? Спасибо
+0

Привет @martin, у меня есть некоторые записи, которые мне нужно сохранить в базе данных, где categoryID и CategoryParentID предопределены. Мне нужно установить CategoryID, поскольку мне нужно установить зависимости над ParentCategoryID. Я пытаюсь избежать дополнительных строк кода, чтобы создать новое сопоставление для настройки категорий и подкатегорий. – Francisco

3

Kentico принимает решение о сохранении или обновлении объекта в зависимости от того, установлен ли его первичный ключ. Так что, если CategoryID установлена ​​система фактически вызывает UPDATE CMS_Category SET ... WHERE CategoryID = @CategoryID вместо INSERT INTO ...

Если вам нужно сохранить оригинальную ссылку (я предполагаю, что вы пытаетесь сохранить внешний идентификатор для целей интеграции) Я предлагаю хранить его в отдельное поле. И чтобы предотвратить изменение системных полей, я бы использовал поле кодового имени - CategoryName.

Хотя предложение @martin кажется хорошей идеей, я уверен, что это не сработает, поскольку Kentico потеряет ссылку на объект, который в настоящее время обновляется. Если у вас есть действующая лицензия на исходный код, посмотрите на CategoryInfoProvider.SetCategoryInfoInternal(), чтобы узнать, о чем я говорю.

+0

Да, это было только догадываться. Я уже пробовал, и он не работает (по указанным причинам). –

+0

Спасибо @rocky, Да, я пытаюсь сохранить внешний ID. Я собираюсь дать ему попробовать, используя поле categoryName для хранения этого идентификатора. – Francisco