LinqToSharepoint插入到具有多种内容类型的列表

时间:2011-12-09 09:45:44

标签: .net linq sharepoint

我在将新记录插入SharePoint列表时遇到问题,该列表在使用Linq2SharePoint时可以包含多个内容类型的项目。

我的列表及其内容类型是由功能创建的,并且在事件接收器中,内容类型绑定是针对多种内容类型创建的。这些实际上是一个彼此继承的类型树,它们都源自一个自定义内容类型,它本身来自内置的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类型而不是它们的派生类型(尽管这不是真正的问题,因为使用一些jiggery涉及到Item的ICustomMapping扩展来访问生成的隐藏内容类型字段如果需要,存储库层也可以访问底层SPListItem并向下转换为派生类型。

当我尝试将项目写入列表时出现问题。首先,我尝试为此目的创建一个特定的EntityList,例如EntityList<RedFoo>但这引起了例外。因此,我也将Foo类型添加到Lists内容类型,并尝试使用EntityList<Foo>添加项目,但这会导致相同的异常。

两个实例中的异常相同,错误消息是“已删除/重命名与映射关联的列”。谷歌搜索这个只找到一个遇到此消息的快乐的人(omourad.blogspot.com/2010/06/columns-associated-with-mappings-have.html),但他的问题是错误地命名他的列表。这不是我的问题。

经过几个小时的拖网搜索后,我发现很少有关于多种内容类型的SPL的讨论,几乎没有任何与Linq和这个问题有关的内容。在CodePlex http://sporm.codeplex.com/上有这个,但它有0次下载,自2009年以来一直很安静......

我尝试直接从数据上下文访问,而不是使用存储库层来确保问题不在我的代码中。我已经通过激活功能从Web重新生成数据上下文,以便我可以确定它不会不同步。

我错过了什么吗?这是由累积更新修复的,我有点错过了吗?当然,我不是唯一一个试图这样做的人?我感觉几乎和你遇到问题时一样孤独,你可以找到的唯一在线参考是StackOverflow风滚草问题。必须有人可以阻止这是一个自己的风滚草问题吗?

1 个答案:

答案 0 :(得分:0)

[插入风滚草的图形]

我对这个问题没有明确的答案,因为看起来这不是一个真正的问题,或者至少我的表现只是一个症状。或许我只是没有一个明确的答案,因为在SharePoint世界中没有明确的答案,似乎完全可以接受说“不要做X”或“你必须做Y”而不能真正解释或证明它。本着这种精神,我会说以下不恰当的不支持的概括:

不要在ContentTypes上使用'Inherits'或'Overwrite'属性。

听起来不错。文档很好看。对于像摆脱那些令人讨厌的“标题”字段这样的事情来说,功能非常棒,但实际上它们似乎并不起作用。我不知道为什么,而且我猜测他们可以给我的最好的SharePoint团队是'发生了错误。请再试一次'或其他一些。我所知道的是没有这两个属性和非常理想的效果,它们使一切都更好。