我在使用Linq2SharePoint时将新记录插入到可包含多个内容类型项目的SharePoint列表时遇到问题。LinqToSharepoint插入到具有多种内容类型的列表
我的列表及其内容类型由功能创建,并且在事件中为多种内容类型创建接收者内容类型绑定。这些实际上是一个相互继承的类型树,它们都是从一个自定义内容类型派生而来的,这些内容类型本身是从内置的Item内容类型派生的。
我的数据上下文由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类型而不是它们的派生类型(尽管这不是真正的问题,因为使用某些操作涉及ICustomMapping扩展项以访问隐藏内容类型字段如果需要,生成的存储库层可以访问底层的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年以来一直安静...
我试着直接从数据上下文访问,而不是使用库层来确保问题不在我的代码中。我使用激活的功能从Web重新生成了数据上下文,以便我可以确定它不会失去同步。
我错过了什么吗?这是由我不知何故错过了累积更新修复的吗?我当然不是唯一试图这样做的人?当你遇到问题时,我感到几乎如此孤单,唯一的在线参考是一个StackOverflow tumbleweed问题。那里一定有人可以阻止这是一个自己的风滚草问题?
Hi Rob, 您可以回顾一下您如何解决Foo问题吗?我很困惑你应该如何在L2SP中对这个模型进行建模,并且似乎你已经使用一些“jiggery”来解决它。 只要你的类型问题,我已经成功地添加到基类型列表的子类型。当你尝试时会抛出什么异常? –
这里是我发布的一个问题的链接 http://stackoverflow.com/questions/9386437/linq-to-sharepoint-multiple-content-types-for-a-single-list –
嗨贾森。我发布了使用ICustomMapping的解释和代码示例,以提供必要的“jiggery”,以便能够从另一个问题的L2SP基础实体解析派生类型。希望能帮助到你。关于通过L2SP插入时遇到的问题,我没有多少解决这些问题,因为我们对ContentType进行了一些更改后,似乎很快消失。经过深入挖掘,2010年实施Inherits属性肯定有点不一致,尽管完全排除我自己的无能为力是不公平的);) – robwilliams