2011-12-09 38 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團隊也不會這樣做,因爲他們能給我的最好的結果就是'發生了錯誤。請再試一次'或者其他一些。我所知道的是沒有這兩個屬性,它們賦予所有東西的非常令人滿意的效果會更好。