2010-04-05 15 views
6

我需要一些關於Visual Studio生成的ADO.NET中強類型數據集的專家建議。這裏是細節。先謝謝你。有關如何在.NET的N層應用程序中使用強類型數據集的問題

  • 我想寫一個N層應用程序,其中表示層是在C#/ Windows窗體中,業務層是Web服務,數據訪問層是SQL數據庫。

  • 因此,我使用了Visual Studio 2005,並在解決方案中創建了3個項目。

  • 項目1是數據訪問層。在此我使用了Visual Studio數據集生成器來創建一個強類型數據集和表格適配器(用於測試我在Northwind的customers表格上創建的)。數據集稱爲NorthWindDataSet,裏面的表是CustomersTable。

  • 項目2有Web服務,它只公開了1個方法,它是GetCustomersDataSet。這使用project1庫的表適配器填充數據集並將其返回給調用者。爲了能夠使用NorthWindDataSet和表格適配器,我添加了對項目1的引用。

  • 項目3是一個勝利表格應用程序,它使用Web服務作爲參考並調用該服務來獲取數據集。

在構建本申請中,在PL的過程中,我添加到項目中的1和形式的負載以上生成的I調用web服務,並從Web服務指定所接收到的數據集的數據集的引用到這個數據集。但我得到的錯誤:

Cannot implicitly convert type 'PL.WebServiceLayerReference.NorthwindDataSet' to 'BL.NorthwindDataSet' e:\My Documents\Visual Studio 2008\Projects\DataSetWebServiceExample\PL\Form1.cs

這兩個數據集是相同的,但因爲我加了來自不同位置的引用,我收到上面的錯誤,我認爲。

所以,我所做的是我添加了項目1(它定義了數據集)對項目3(UI)的引用,並使用Web服務獲取DataSet並分配到正確的類型,現在項目3(具有Web窗體)運行,我得到下面的運行時異常。

System.InvalidOperationException: There is an error in XML document (1, 5058). ---> System.Xml.Schema.XmlSchemaException: Multiple definition of element ' http://tempuri.org/NorthwindDataSet.xsd:Customers ' causes the content model to become ambiguous. A content model must be formed such that during validation of an element information item sequence, the particle contained directly, indirectly or implicitly therein with which to attempt to validate each item in the sequence in turn can be uniquely determined without examining the content or attributes of that item, and without any information about the items in the remainder of the sequence.

我想這可能是因爲一些交叉引用錯誤。

我的問題是,有沒有辦法使用Visual Studio生成的DataSets,以便我可以在所有圖層中使用相同的DataSet(用於重用),但將表適配器邏輯與數據訪問層分開,以便前端是從Web服務中抽象出來的?

如果我有手寫代碼,我會放棄數據集生成器給出的優點,並且如果以後添加了列,我需要手動添加它等,因此我想盡可能使用Visual Studio嚮導。

回答

2

如果我是你,我會遠離數據集。他們是.NET 2.0的解決方案,他們也不是一個很好的解決方案。

我會使用實體框架作爲數據層 - 他們沒有DataSet存在的問題,包括您看到的問題。一個DataSet必須同時存在於XML和關係兩個世界中,並且它們並不總是適合的。實體框架可以建立實體模型,只需要遵循繼承和關聯等標準編程概念。

實體框架在通過Web服務傳輸時也具有較少的問題。您應該使用WCF來處理所有新的Web服務工作(Microsoft現在認爲ASMX Web服務是「傳統技術」),但即使使用ASMX Web服務,EF實體也將相當乾淨地傳輸。在.NET 3.5中有一些相對較小的問題,但在.NET 4.0中解決了這些問題。

0

我會在這裏備份John,我們在N層應用程序中使用EF v1.0,當然它有它自己的問題,但是您可以獲得可以通過服務推送的常規對象。不過,我建議(如果你使用EF1而不是EF4,它能夠將它的對象作爲POCO的對象)將單獨的一層DTO對象映射到你的DAL的DO對象,並使用DTO進行服務轉換。也可以考慮使用.NET RIA服務,他們真的太棒了

@sb:上DTO,在EFquick overlook of RIA services, 上DTO with datasets老的文章,你正在嘗試做的。

+0

謝謝。我可以在哪裏瞭解更多關於上述主題的內容?此外,這是一個遺留項目,所以將現有代碼(大代碼庫)移動到新範例可能會有所幫助,但我可能沒有很大的靈活性,但移動時可能沒有太多... – 2010-04-05 04:35:25

+0

我在我的評論中添加了鏈接 – vittore 2010-04-05 21:52:57

+0

感謝您的支持三分球! – 2010-04-08 07:52:38

0

My question is, is there a way to use the visual studio generated DataSets in such a way that I can use the same DataSet in all layers (for reuse) but separate the Table Adapter logic to the Data Access Layer so that the front end is abstracted from all this by the web service

如果你不想重寫你的應用程序的EF或添加的DTO,你知道的模式是平等的,你可以在通過Web服務表示層設定資料集架構。

Project3DataSet.ReadXmlSchema( 
    new StringReader(Project2WebService.GetCustomersDataSetSchema())); 

[WebMethod] 
public string GetCustomersDataSetSchema() 
{ 
    return new Project1DataSet().GetXmlSchema(); 
} 

您的數據集模式充當對象模型。不漂亮,但應該完成這項工作。這就是說,如果這是一個新項目,我同意其他答案 - 避免使用數據組。

+0

謝謝。這肯定會幫助我,因爲這是一個遺留代碼庫,我可能無法移動到EF。有很多代碼已經存在。再次感謝你。 – 2010-04-05 04:35:57

相關問題