LINQ to SQL 與 ADO.Net Data Service 的搭配使用

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;amp;amp;lt;DataServiceKey(""{0}"")&amp;amp;amp;amp;gt; _" &amp;amp;amp;amp; "<BR>", String.Join(""", """, info.KeyFields.ToArray()))
writer.AppendFormat("Partial Class {0} " &amp;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…….我想我還是放棄吧….

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *