ADO.Net Data Service 微軟大都是與 ADO.NET Entity Model來搭配使用
不過我還是習慣用LINQ to SQL 的DBML(不過使用此方法有些缺點,後面再提)
首先會遇到的第一個問題就是Data Service發生錯誤不會顯示相關訊息
解決這問題的方法就是把下面這行加到Data Service的Class上面就會顯示錯誤訊息了
<ServiceBehavior(IncludeExceptionDetailInFaults:=True)>
<ServiceBehavior(IncludeExceptionDetailInFaults:=True)> _ Public Class WDS ' TODO: 以您的資料類別名稱取代 [[class name]] Inherits DataService(Of NorthwindEntities) ' 只呼叫一次方法初始化全服務原則。 Public Shared Sub InitializeService(ByVal config As IDataServiceConfiguration) ' TODO: 設定規則,指出哪些實體集及服務作業可見、可更新等等。 ' 範例: config.SetEntitySetAccessRule("*", EntitySetRights.All) config.SetServiceOperationAccessRule("*", ServiceOperationRights.All) End Sub End Class
接下來的問題就是DBML裡Table Key的問題
就算你在DBML裡把每張Table都設好Key也是不行
必需新增一個Class檔,而這個Class必需去Partial Class [DBML Table]
假如你的DBML裡有個Table叫Categories,這張表的Key是CategoryID,那麼就用以下程式碼
注意Key有大小寫之分
'有大小寫分別 <DataServiceKey("CategoryID")> _ Partial Class Categories End Class
如果有1個Key以上的話程式碼如下面
<DataServiceKey("EmployeeID", "TerritoryID")> _ Partial Class EmployeeTerritories End Class
你可以把這些程式碼放在同一個Class.vb檔裡方便管理
如果是幾張表手動加一加就算了,如果有好幾張那不就加到瘋掉
google了一下,果然有人已經寫好解決的方法了,有興趣的可以到這邊看看
不過程式是C#語法的,手癢改成了VB.Net語法(LINQ的那一個)
下面是ASP.Net的方式,如果你要用AP的方式產生還要修還一下文字
'使用方式 Dim db As New NorthwindDataContext Dim sb As New System.Text.StringBuilder GenerateDataServiceKeyAttributePartialClass _ (CType(db.GetType.Assembly, Reflection.Assembly), sb) Response.Write(sb.ToString) '-------------------------- Private Shared Sub GenerateDataServiceKeyAttributePartialClass _ (ByVal assembly As Reflection.Assembly, _ ByVal writer As System.Text.StringBuilder) Dim tableInfoList = From t In assembly.GetTypes() _ Where t.GetCustomAttributes(GetType(TableAttribute), True).Length = 1 _ Select New With { _ .TypeName = t.Name, _ .KeyFields = (From p In t.GetProperties() _ Let columns = p.GetCustomAttributes(GetType(ColumnAttribute), True) _ Where columns.Length = 1 AndAlso DirectCast(columns(0), ColumnAttribute).IsPrimaryKey _ Select p.Name).ToList() _ } For Each info In tableInfoList writer.AppendFormat("<BR>" &amp;amp;amp; "&amp;amp;amp;lt;DataServiceKey(""{0}"")&amp;amp;amp;gt; _" &amp;amp;amp; "<BR>", String.Join(""", """, info.KeyFields.ToArray())) writer.AppendFormat("Partial Class {0} " &amp;amp;amp; "<BR> End Class", info.TypeName) Next End Sub
不過用LINQ to SQL要注意一個地方,就是文最上面所說的”缺點”
當你要對資料新增、刪除、修改時會發生錯誤
我猜想應該是你把以LINQ to SQL 做的Data Service這個參考加進來時
VS.NET還是把他轉成Entity Model,但是卻沒有對增、刪、修來實做,所以會發生錯誤
最明顯的判別就是Data Service裡沒有SubmitChanges()這個函式,不過卻有SaveChanges()這個函式
SaveChanges() 是ADO.NET Entity Model才有的東西
後來我有測試使用ADO.NET Entity Model去建立這個Data Service,結果是正常的
可能這就是微軟MSDN上找到的文章都是用ADO.NET Entity Model來當Data Service的ORMapping的中介的原因….
因為LINQ to SQL對Data Service的成熟度還不夠
不過對於ADO.NET Entity Model…….我想我還是放棄吧….