У меня возникла проблема с вводом новых записей в список 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. Должен быть кто-то там, кто может остановить это как вопрос, связанный с перепадом?
Hi Rob, Не могли бы вы решить, как вы решили проблему Foo? Я смущен тем, как вы должны моделировать это в L2SP, и кажется, что вы решили его «с помощью некоторой jiggery». Что касается проблемы с вашим типом, мне удалось добавить подтип в список базового типа. Какое исключение оно бросает, когда вы пытаетесь? –
Вот ссылка на вопрос, который я разместил об этом http://stackoverflow.com/questions/9386437/linq-to-sharepoint-multiple-content-types-for-a-single-list –
Привет, Джейсон. Я разместил объяснение и образец кода для использования ICustomMapping, чтобы предоставить необходимую «jiggery», чтобы иметь возможность разрешить производный тип из базового объекта L2SP по вашему другому вопросу. Надеюсь, поможет. Что касается моих проблем с вставкой через L2SP, я не столько исправлял их, сколько радовался тому, как они исчезали, когда мы вносили некоторые изменения в наши ContentTypes. После многократного копания существует определенная небольшая несогласованность в реализации атрибута Inherits в 2010 году, хотя было бы несправедливо полностью исключать мой собственный вклад в неспособность;) – robwilliams