2011-12-09 2 views
2

У меня возникла проблема с вводом новых записей в список SharePoint, который может содержать элементы более чем одного типа содержимого при использовании Linq2SharePoint.LinqToSharepoint вставить в список с несколькими типами контента

Мой список и его типы содержимого создаются с помощью функции, а в случае, когда привязки типов содержимого получателя создаются для нескольких типов содержимого. Это на самом деле дерево типов, наследующих друг от друга, которые все производятся из одного настраиваемого типа контента, который сам вытекает из встроенного типа содержимого элемента.

Контекст моих данных генерируется SPMetal, а затем из этого слоя репозитория создается с использованием пользовательских шаблонов T4. Я не использую Linq2SharePoint для доступа к именованным спискам, а скорее для создания репозиториев для типов контента. Действительно, поскольку список, о котором идет речь, может быть создан в любом SPWeb, активируя эту функцию, он не существует во время компиляции, поэтому неизвестен контексту данных.

В MSDN объясняется, что для обработки списков более чем одного типа контента SPMetal создает контекст данных, чтобы использовать ближайший базовый тип содержимого для списка такого характера. См. Раздел «Генерирующие объекты для типов контента» здесь http://msdn.microsoft.com/en-us/library/ff798478.aspx

На основании этого я обращаюсь к списку с использованием базового типа содержимого. Например если предположить следующее содержание иерархии типов:

Item 
    Foo : Item 
    BlueFoo : Foo 
    RedFoo : Foo 
     BrightRedFoo : RedFoo 
     DarkRedFoo : RedFoo 
    GreenFoo : Foo 

Тогда мой список может содержать элементы любого из типов контента XXXFoo и для доступа к нему контекст данных использует EntityList<Foo>.

Это прекрасно работает для чтения элементов из списка, хотя они все типа Foo, а не их производные типы (хотя это не проблема, так как использование некоторой jiggery включает расширение ICustomMapping для Item для доступа к полю скрытого содержимого, Сгенерированный уровень репозитория может получить доступ к базовому SPListItem и приложению вниз к производному типу, если это необходимо).

Проблема возникает, когда я пытаюсь написать элемент в списке. Сначала я попытался создать конкретный EntityList для этой цели, например. EntityList<RedFoo>, но это вызвало исключение. Итак, я добавил тип Foo в типы содержимого списков и попытался добавить элемент с помощью EntityList<Foo>, но это вызывает одно и то же исключение.

Исключение в обоих случаях одинаково и сообщение об ошибке «Столбцы, связанные с сопоставлениями, были удалены/переименованы». Поиск Google для этого находит только одного счастливого человека, который столкнулся с этим сообщением (omourad.blogspot.com/2010/06/columns-associated-with-mappings-have.html), но его проблема была неверно названа его списком. Это не моя проблема.

После нескольких часов траления WWW я нахожу очень мало дискуссий по SPLists с несколькими типами контента и практически ничего не относящихся к Linq и этой проблеме. Это на CodePlex http://sporm.codeplex.com/, но у него есть 0 загрузок и было тихо с 2009 года ...

Я попытался получить доступ непосредственно из контекста данных, а не использовать уровень репозитория, чтобы убедиться, что проблема не в моем коде , Я восстановил контекст данных из Интернета с активированной функцией, чтобы я мог убедиться, что она не синхронизирована.

Я что-то упустил? Является ли это фиксированным кумулятивным обновлением, которое я как-то пропустил? Неужели я не единственный человек, который пытался это сделать? Я чувствую себя почти так же одиноко, как когда у вас есть проблема, и единственная онлайн-ссылка, которую вы можете найти, - это вопрос о переполнении StackOverflow. Должен быть кто-то там, кто может остановить это как вопрос, связанный с перепадом?

+0

Hi Rob, Не могли бы вы решить, как вы решили проблему Foo? Я смущен тем, как вы должны моделировать это в L2SP, и кажется, что вы решили его «с помощью некоторой jiggery». Что касается проблемы с вашим типом, мне удалось добавить подтип в список базового типа. Какое исключение оно бросает, когда вы пытаетесь? –

+0

Вот ссылка на вопрос, который я разместил об этом http://stackoverflow.com/questions/9386437/linq-to-sharepoint-multiple-content-types-for-a-single-list –

+0

Привет, Джейсон. Я разместил объяснение и образец кода для использования ICustomMapping, чтобы предоставить необходимую «jiggery», чтобы иметь возможность разрешить производный тип из базового объекта L2SP по вашему другому вопросу. Надеюсь, поможет. Что касается моих проблем с вставкой через L2SP, я не столько исправлял их, сколько радовался тому, как они исчезали, когда мы вносили некоторые изменения в наши ContentTypes. После многократного копания существует определенная небольшая несогласованность в реализации атрибута Inherits в 2010 году, хотя было бы несправедливо полностью исключать мой собственный вклад в неспособность;) – robwilliams

ответ

0

[Вставить график перекати здесь]

У меня нет четкого ответа на этот вопрос, как, казалось бы, это не проблема, или, по крайней мере, проявление у меня было всего лишь симптом. Или, может быть, у меня просто нет четкого ответа, поскольку нет четких ответов в мире SharePoint, где кажется вполне приемлемым сказать «Do not do X» или «Вы должны делать Y», не имея возможности объяснить или оправдать Это. В этом духе я бы сказал следующие неуместные неподдерживаемые обобщения:

Не используйте атрибуты «Наследовать» или «Перезаписать» в ContentTypes.

Звучит неплохо. Документы выглядят хорошо. Функциональность была бы невероятной для вещей, таких как избавление от этого удручающего поля «Название», но на самом деле они просто не работают. Я не знаю, почему, и я предполагаю, что ни команда SharePoint, как лучшее, что они могут мне дать, это «Произошла ошибка. Повторите попытку »или некоторые из них. То, что я знаю, не имеет этих двух атрибутов, и очень желательные эффекты, которые они придают всем, работают намного лучше.

Смежные вопросы