2010-12-14 41 views
2

我正在做的事情,我認爲是非常正常的(雖然我個人並沒有這樣做過),我已經假設會有一個「不費吹灰之力」的方式,但我還沒有找到它 - 這真的很令人沮喪。WPF應用程序與WCF數據 - EF,Linq2Sql或WCF數據服務 - 無似乎'易'

我將創建一個WPF應用程序,這是一個面向數據的業務應用程序。我的數據將來自一個遠程IIS服務器(我控制),它有一個標準的SQL Server 2008數據庫,所以Web服務/ WCF似乎是前進的方向。遠程服務需要通過用戶(WPF客戶端)的用戶名/密碼登錄來安全(合理)。我不希望使用第三方的ORM產品,但我期望數據層(服務和數據庫之間)能夠應付非常簡單的ORM類型功能(我真的不想手工製作數據檢索和持久層)。我並不擔心併發性,因爲這將是一個相當簡單的應用程序。

我的選擇似乎是下列之一:

  1. ADO.NET實體框架在WCF
  2. LINQ2SQL在WCF
  3. WCF數據服務

在進一步的調查,沒有以上似乎是'沒有腦子'Im後

1)ADO.NET實體框架 - Ive有一個這樣的戲劇,並通過WCF序列化對象的各種問題。即使當我嘗試生成POCO實體並使用它們時,Im也不得不用自定義屬性修飾服務合約,以使其始終不會出錯,而且我似乎不得不手動啓動任何東西而不是平面對象圖。在我看來,EF根本不是通過服務暴露的。

2)Linq2Sql - 這看起來不像EF好多少。我似乎不得不手動過多的東西。我曾嘗試設計器和SQLMetal,但似乎沒有任何「正常工作」 - 它都需要擺弄。 3)WCF數據服務 - 這看起來像是一個很好的選擇,但本質上,它似乎就像我剛剛在服務層上暴露我的SQL數據庫表'原始'。我不以任何方式成爲這項技術的專家,但它似乎是一種潛在的危險方法,除此之外,它似乎不支持任何類型的訪問安全性作爲標準(您必須破解它才能要求認證)。

正如我所說,這種情況下,它應該有一個不費腦的解決方案,但我仍然撓撓我的腦袋。我用.NET技術做了很多事情,但說實話,這個領域在我的理解中代表了一些漏洞,所以我很抱歉,如果我的任何評論或假設是天真的。

當然,EF或Linq2SQL上的'hacky'long-round-round可能是我所能做的,在這種情況下,我可以捲起袖子,並且接受這樣一個事實,沒有錯過更優雅的解決方案。

任何幫助/建議將不勝感激。

回答

3

這是一個有點主觀,但我會提供我的意見。

首先,忘記L2SQL - 它基本上已經過時,並且沒有EF4的完整POCO支持(可以完成,但需要XML修補或SQLMetal生成),這意味着串行化您的實體將是一個從左到右的實體克隆噩夢。

我將通過WCF,Entity Framework 4.0專門與ADO.NET實體框架一起使用。您將在模型中擁有豐富的靈活性(包括應用OO原則(如繼承)的能力)。

使用自追蹤實體。是的,你必須修飾服務合同 - 這是設計的原因,這有很多原因。

您可以始終使用DTO,而不是序列化實際的EF實體。

OData在靈活性和簡單性方面確實不錯。但是,如果您只通過單個客戶端應用程序來使用您的模型,那麼專門的服務層(WCF)是更好的方法IMO。

+0

我同意,對於任何新的應用程序,EF是要走的路,而不是L2S。然而,L2S確實支持POCO(並且從一開始就這樣做)。只需google'LINQ to SQL POCO'。 – Steven 2010-12-14 11:20:25

+0

@Steven - 不知道。然後我再次碰到L2S - 我是一個EF小組。 :) – RPM1984 2010-12-14 11:23:06

+0

是的,似乎自我追蹤可能是前進的方向。我發現一個很好的破敗(見鏈接),並會給他們一個嘗試 - 謝謝 http://blogs.msdn.com/b/adonet/archive/2009/06/22/feature-ctp-walkthrough-self-跟蹤實體換的實體,framework.aspx – 2010-12-14 11:34:27

1

3)WCF數據服務 - 這似乎是 在它的臉一個不錯的選擇,但本質上 好像我只是 暴露我的SQL數據庫表「中 原」過度服務層。

這可能是第一印象 - 但它從本質上是錯誤的。通過網絡公開的內容是模型 - 您完全可以控制進入該模型的內容,以及WCF數據服務的使用者如何能夠看到和/或甚至更新該模型中的實體。

這就是實體框架進入和發光的地方(以及Linq-to-SQL悲慘失敗的地方):您可以將數據庫(或至少部分數據庫)抓取到實體數據模型中,然後對其進行修改。你可以調整你的實體名稱與你的表名完全不同,你可以添加計算屬性,你可以刪除某些屬性等等。

如果你談論的是一個相當簡單的應用程序,這是肯定的方式,我會去:

  • 抓住你的數據庫,並使用EF把它變成一個實體數據模型
  • 公開該EDM過WCF數據服務,並定義什麼可以看到只讀,甚至可能通過電線更新什麼是