SharePoint 2010 Получение ArgugmentException: значение не является допустимым guid при вызове обновления для SPPersistedObject - PullRequest
1 голос
/ 17 ноября 2010

У меня есть несколько классов, производных от SPPersistedObject. Одним из них является мой класс верхнего уровня, который содержит коллекцию других производных объектов SPPersistedObject. Вот примерный план моего кода:

[System.Runtime.InteropServices.GuidAttribute("9BEDC353-F0AC-40FA-A28B-E18FB22EA9CA")
internal class FolderSettings : SPPersistedObject
{
     [Persisted]
     Guid _folderId;

     [Persisted]
     string _folderName;

     public FolderSettings() : base() {}

     protected FolderSettings(Guid folderId, string folderName) : base()
     {
         _folderId = folderId;
         _folderName = folderName;
     }
}

[System.Runtime.InteropServices.GuidAttribute("329DE509-76E6-4FA5-A9C1-2543F0A6B5D3")]
internal class EnhancedFolderSettings : FolderSettings
{
    [Persisted]
    string _outputLocation;

    public EnhancedFolderSettings() : base() {}

    public EnhancedFolderSettings(Guid folderId, string folderName,
        string outputLocation) : base(folderId, folderName)
    {
         _outputLocation = outputLocation;
    }
}

[System.Runtime.InteropServices.GuidAttribute("62FA87FB-2BB4-4AC6-A82A-737E8BEC0219")]
internal class EnhancedFolderSettingsCollection : SPPersistedObject,
    IDictionary<Guid, EnhancedFolderSetrtings>
{
     [Persisted]
     Dictionary<Guid, EnhancedFolderSettings> _collection =
         Dictionary<Guid, EnhancedFolderSettings>();

     public EnhancedFolderSettingsCollection() : base() {}

     // Implementation of IDictionary Interface here

     // Implementation of ICollection Interface here

     // Implementation of IEnumerable Interface here
}

[System.Runtime.InteropServices.GuidAttribute("F080ED50-85DF-4821-884B-97B05995F8F1")]
internal class FeatureSettings : SPPersistedObject
{
     [Persisted]
     string _workingFolder;

     [Persisted]
     string _serviceIpAddress;

     public FeatureSettings() : base() {}

     public FeatureSettings(string name, SPPersistedObject parent)
         : base(name, parent)
     {
     }

     protected override bool HasAdditionalUpdateAccess()
     {
         return true;
     }
}

[System.Runtime.InteropServices.GuidAttribute("C54B006A-69D4-4315-A9FF-F7998A985935")]
internal class EnhancedFeatureSettings : FeatureSettings
{
     const string _SETTINGS_NAME = "EnhancedSettingsName";

     [Persisted]
     Dictionary<Guid, EnhancedFolderSettingsCollection> _siteFeatureSettings;

     public EnhancedFeatureSettings() : base() {}

     public EnhancedFeatureSettings(SPPersistedObject parent)
         : base(_SETTINGS_NAME, parent)
     {
     }

     public static EnhancedFeatureSettings GetSettings(bool createNew)
     {
          EnhancedFeatureSettings settings =
              SPFarm.Local.GetChild<EnhancedFeatureSettings>(_SETTINGS_NAME);
          if (settings == null && createNew)
          {
               settings = new EnhancedFeatureSettings(SPFarm.Local);
          }
          return settings;
     }

     internal EnhancedFolderSettingsCollection GetSiteSettings(Guid siteId)
     {
          EnhancedFolderSettingsCollection collection = null;
          _siteFeatureSettings.TryGetValue(siteId, out collection);
          return collection;
     }

     internal Dictionar<Guid, EnhancedFolderSettingsCollection> FolderSettings
     {
          get
          {
                return _siteFeatureSettings;
          }
     }
}

Это все классы настроек, теперь приведен пример кода, который пытается обновить настройки и вызывает ошибку. Следует отметить, что это выполняется в административном контексте (из окна конфигурации CentralAdmin), поэтому я не думаю, что это связано с разрешениями:

public void UpdateSettings(Guid siteId, Guid folderId,
     EnhancedFolderSettings currentSettings)
{
      var settings = EnhancedFeatureSettings.GetSettings(true);
      var siteSettings = settings.GetSiteSettings(siteId);
      if (siteSettings == null)
      {
           siteSettings = new EnhancedFolderSettingsCollection();
      }

      siteSettings[folderId] = currentSettings;
      settings.FolderSettings[siteId] = siteSettings;

      settings.Update() // This is the line that is causing the exception
}

Любая помощь будет оценена. Исключение составляет:

System.ArgumentException: значение не является допустимым guid.

Трассировка стека указывает на линию settings.Update().

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Приемлемым решением в текущей ситуации является внесение изменений в полевую реализацию.Вы можете создать свой собственный класс с массивом , производным от SPAutoSerializingObject, IEnumerable и т. Д., Где вы реализуете все функциональные возможности своего поля словаря (или списка) и используете этот класс, гарантированный Dictionary <> или Списки <>

Надеюсь, что это поможет.

0 голосов
/ 22 марта 2011

У меня та же проблема, и я пытаюсь найти решение, более глубокое в SPPersistedObject. Во время моего исследования я удаляю guid в атрибутах класса и после этого приложения генерирую новое исключение. «Оператор INSERT конфликтовал с ограничением FOREIGN KEY« FK_Dependencies1_Objects ». Конфликт произошел в базе данных« SharePoint_Config », таблице« dbo.Objects », столбце« Id ». Оператор был прерван. "Таким образом, это исключение происходит из базы данных SharePoint Config.

0 голосов
/ 23 декабря 2010

Я отвечаю на свой вопрос, так как у меня еще не было ответов, и теперь я получил новую информацию.Вы можете увидеть связанный вопрос, который я разместил на SharePoint.SE .Я обнаружил, что в этом коде были некоторые недостающие фрагменты, но даже после обработки некоторых из этих вещей у меня все еще были проблемы.После попытки нанять консультанта, который поможет решить эту проблему, я получил ответ, который в основном гласил: «Не делай этого».Фреймворк SPPersistedObject может быть нестабильным (несколько сообщений об этом в Интернете) и не предназначен для того, чтобы делать то, что я пытаюсь сделать.Было рекомендовано изменить структуру настроек для использования скрытых списков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...