作法:動態建立資料庫
在 LINQ to SQL 中,物件模型 (Object Model) 會對應至關聯式資料庫。 對應的啟用方式是使用以屬性 (Attribute) 為基礎的對應或外部對應檔案來描述關聯式資料庫的結構。 在這兩種情況中,系統會提供足夠的關聯式資料庫相關資訊,可讓您使用 DataContext.CreateDatabase 方法來建立新的資料庫執行個體 (Instance)。
DataContext.CreateDatabase 方法只會針對物件模型中所編碼的資訊範圍,建立資料庫的複本。 物件模型中的對應檔案和屬性可能不會編碼現有資料庫結構的所有項目。 對應資訊並不代表使用者定義函式、預存程序 (Stored Procedure)、觸發程序 (Trigger) 或檢查條件約束 (Check Constraint) 的內容。 這個行為對各種資料庫而言就已足夠。
您可以將 DataContext.CreateDatabase 方法用在許多情況下,特別是在已知的資料提供者 (Data Provider) (如 Microsoft SQL Server 2008) 可用時。 典型情況包括:
建置應用程式,這個應用程式會自動將它自己安裝在客戶系統上。
建置用戶端應用程式,這個用戶端應用程式需要本機資料庫來儲存它的離線狀態。
根據連接字串,您也可以使用 .mdf 檔案或目錄名稱來搭配使用 DataContext.CreateDatabase 方法與 SQL Server。 LINQ to SQL 會使用連接字串來定義要建立的資料庫,以及要在其上建立資料庫的伺服器。
注意
請盡可能使用 Windows 整合式安全性來連接至資料庫,如此連接字串就不需要使用密碼。
範例 1
下列程式碼會提供如何建立名為 MyDVDs.mdf 之新資料庫的範例。
public class MyDVDs : DataContext
{
public Table<DVD> DVDs;
public MyDVDs(string connection) : base(connection) { }
}
[Table(Name = "DVDTable")]
public class DVD
{
[Column(IsPrimaryKey = true)]
public string Title;
[Column]
public string Rating;
}
Public Class MyDVDs
Inherits DataContext
Public DVDs As Table(Of DVD)
Public Sub New(ByVal connection As String)
MyBase.New(connection)
End Sub
End Class
<Table(Name:="DVDTable")> _
Public Class DVD
<Column(IsPrimaryKey:=True)> _
Public Title As String
<Column()> _
Public Rating As String
End Class
範例 2
您可以使用物件模型來建立資料庫,步驟如下所示:
public void CreateDatabase()
{
MyDVDs db = new MyDVDs("c:\\mydvds.mdf");
db.CreateDatabase();
}
Public Sub CreateDatabase()
Dim db As New MyDVDs("c:\...\mydvds.mdf")
db.CreateDatabase()
End Sub
範例 3
建置 (Build) 會自動在客戶系統上自行安裝的應用程式時,請查看資料庫是否已經存在,並在建立新的資料庫之前卸除現有的資料庫。 DataContext 類別 (Class) 會提供 DatabaseExists 和 DeleteDatabase 方法來協助您進行此程序。
下列範例顯示可以使用這些方法來實作此方法的方式:
public void CreateDatabase2()
{
MyDVDs db = new MyDVDs(@"c:\mydvds.mdf");
if (db.DatabaseExists())
{
Console.WriteLine("Deleting old database...");
db.DeleteDatabase();
}
db.CreateDatabase();
}
Public Sub CreateDatabase2()
Dim db As MyDVDs = New MyDVDs("c:\...\mydvds.mdf")
If db.DatabaseExists() Then
Console.WriteLine("Deleting old database...")
db.DeleteDatabase()
End If
db.CreateDatabase()
End Sub