2011-12-09 73 views
2

我在使用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问题。那里一定有人可以阻止这是一个自己的风滚草问题?

+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插入时遇到的问题,我没有多少解决这些问题,因为我们对ContentType进行了一些更改后,似乎很快消失。经过深入挖掘,2010年实施Inherits属性肯定有点不一致,尽管完全排除我自己的无能为力是不公平的);) – robwilliams

回答

0

[风滚草的插入图形这里]

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

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

他们听起来不错。文档看起来不错。这个功能对于摆脱这个令人讨厌的'Title'字段的事情来说会很棒,但实际上他们似乎并不工作。我不知道为什么,我猜测SharePoint团队也不会这样做,因为他们能给我的最好的结果就是'发生了错误。请再试一次'或者其他一些。我所知道的是没有这两个属性,它们赋予所有东西的非常令人满意的效果会更好。

相关问题