步步學LINQ to SQL 將類對映到資料庫表

2021-09-30 21:43:53 字數 3187 閱讀 2124

該系列教程描述了如何採用手動的方式對映你的物件類到資料表(而不是使用象sqlmetal這樣的自動化工具)以便能夠支援資料表之間的m:m關係和使用實體類的資料繫結。即使你選擇使用了自動生成類的工具,理解這一實現過程可以讓你更加方便地對你的應用程式加以擴充套件。

下面闡述本文的目標以及該示例程式為初級開發人員介紹如何學習linq的基本要點:

·使用linq tosql將sql server資料庫表對映到與之關聯的物件上。

·執行一些簡單的linq查詢來檢索資料。

本文詳細為你闡述了如何在你的應用程式中實現linq to sql。附件的示例程式包括了這裡**的所有**,還提供了乙個簡單的wpf圖形介面程式來顯示通過資料繫結返回的結果集。

開始部分:linq to sql是一種物件關係隱射工具,該工具允許你在.net 3.5框架平台上將sql server資料庫對映成物件類。

資料庫:該示例使用sql server express作為資料庫,在該資料庫中包涵了books, authors, 和 categories三張資料表。每本書僅僅屬於某一圖書類別,但是每本書可有多個作者,每個作者可以寫多本書。bookauthors表用於處理books表和authors表之間的多對多關係。為簡單起見,除了books.category列以外,其餘列都不允許為空。

這些表可以允許我們針對每個主型別進行關係(1:m,m:1,和m:m)之間的對映。

本文的其餘部分將描述如何將應用程式的資料表與它們的物件類關聯起來以及如何使用linq來檢索結果集。linq將使用這些資料表作為示例來闡述這些概念。

應用程式:使用linq to sql, 建立乙個.net 3.5框架之上的工程並新增對程式集 system.data.linq的引用。

1、對映datacontext到資料庫

如果你為資料庫建立了乙個強型別的datacontext,則該類只會對外提供乙個單一的入口點,使得外界可以方便地的訪問你的資料。該類將負責處理資料庫的連線並定義你需要連線的每張資料庫表。

*注意: 在datacontext類中你可以忽略m:m的表連線(例如:bookauthor),因為它們僅僅使用they're only used behind the scenes to hook up m:m relationships(在本文的後半部分會進行闡述)。

(1)建立乙個使用了 [database]特性的類來擴充套件 datacontext

建立乙個擴充套件自datacontext的資料庫類,並為其新增[database]特性以表明該類被對映到了資料庫。

如果你使用的類名與資料庫的名稱不一樣,那麼你可以通過使用特性的name引數進行設定([database (name="bookcatalog")])。如果名稱是相同的,此時你可以忽略該引數。

(2)新增乙個帶資料庫連線字串的建構函式

新增乙個帶有資料庫連線字串為引數的建構函式,並呼叫base()方法以告訴父類如何連線你的資料庫。

該建構函式的資料庫連線字串以引數的形式讀取,它可以是從乙個屬性檔案讀取,或者直接硬編碼到函式中,在本文的示例中我們就採用了硬編碼這樣的方式(假設這裡的字串連線到sql server compact資料庫,bookcatalog.sdf,該檔案與bookcatalog.mdf位於相同的目錄):

public bookcatalog( ) : base( "data source=.\\sqlexpress;" +

"attachdbfilename=|datadirectory|\\bookcatalog.mdf;" +

"integrated security=true;user instance=true" )

注意,在工程中,book catalog示例包括了資料庫,和bookcatalog.sdf檔案。對於使用linq to sql來說,這不是必要的,在這裡僅僅只是加以說明而已。

(3)申明資料表

最後,你可以為每張資料表建立乙個型別為table的物件類集合。

通常,你可以先建立這些類,下面我們來看看這一建立過程。我們將建立三個類(author, book, 和category)--每個類對應一張資料表。因此,我們將為每個類型別新增乙個table集合並將這些集合命名為乙個有意義的名字。注意,為資料庫表名對應的類或集合命名不是必須的。我們將在下一節了解如何為資料表指定名稱。

2、將實體類對映到資料庫表

為連線到應用程式的每張資料庫表建立類物件。我們將以book表為例子闡述這一實現過程。

(1)建立帶有[table]特性的類

建立乙個特性為table的book類將其對映到對應的資料庫表。

為資料庫表的name引數指定名稱([table( name = "books" )])。這裡我們這樣做是因為表的名稱(books)和我們的類名(book)不同。如果它們相同,可以忽略該name引數的設定。

(2)使用[column( isprimarykey = true )]特性新增乙個字段作為表的主鍵。

如果你的主鍵在資料庫中設定成了identity,那麼需要新增乙個引數isdbgenerated = true。

相對於資料庫列名,如果你想為字段或屬性設定成不同的名字,可以使用(name="")標籤來實現.否則程式會預設以你的字段或屬性名稱作為列名,正如我們這裡的book's主鍵:id那樣。

[column( isprimarykey = true, isdbgenerated = true )]

public int id

(3)使用[column]特性為表新增其他非關係列

後面部分我們將會回到關係物件上來。現在,咱們開始了解表物件的非主鍵,外來鍵列。book有兩個這樣的列:title 和 price。其資料型別由資料庫的money型別轉換到了.net的decimal型別,以及由varchars型別轉換到了.net的string型別。linq會自動為你處理這些資料型別之間的轉換。

[column] public string title

[column] public decimal price

book catalog應用程式的author和category也進行了這樣的處理,即這三個類物件都對應於自己的資料表:

Linq to Sql實體對映到資料庫很方便

在nhibernate中我們可以先寫好實體類,然後根據配置檔案生成資料庫,這是非常oo的思維。在物件導向的開發設計中,只有那些需要持久的類最終才會儲存到資料庫中。由於需求的變化,可能會引起類的變動,而且這種變化是常見的 正常的,最後類的儲存也是要發生變化的,這樣首先設計好資料庫反而不方便,也沒有必要...

如何將ORM模型對映到資料庫中?

1.用declarative base根據engine建立乙個orm基類。1.用declarative base根據engine建立乙個orm基類。from sqlalchemy.ext.declarative import declarative base engine create engine...

SQL Server將資料庫的使用者名稱對映到登入名

將資料庫伺服器上的資料庫檔案拷貝到另外一台機器上,附加後,新建登入名時無法將原資料庫使用者對映到此登入名。這樣用新建的登入名訪問資料庫時,必須要以 架構名.物件名 的形式才可以。通過以下方式可以解決該問題 步驟1 exec sp change users login report 列出當前資料庫的孤...