LINQS (Language INtegrated Query for Schema) 是一個以 C# 語法**強類型描述數據庫模型**,並能生成 SQL 建庫腳本、直接操作 SQL Server Express 建立物理庫的工具庫。本文演示 0.0.6 版核心流程:模型描述 → 腳本生成 → 物理建庫。
// 引用 Katmai 命名空間
var profession = new Table {
Name = "Profession",
Columns = new IColumn[] {
new Column { Name = "Name", Type = new NVarChar(50) }
}
};
var db = new Database {
Name = "NameCards",
Tables = new Table[] {
new Table {
Name = "Person",
Columns = new IColumn[] {
new Column { Name = "Name", Type = new NVarChar(50) },
new Column { Name = "Age", Type = new Int() },
new AssociationColumn { Name = "ProfessionID", Table = profession } // 外鍵關聯
}
},
profession
}
};
foreach (var t in db.Tables) {
if (t.PrimaryKey == null) {
var id = new IdentityColumn(t.Name + "ID"); // 自增主鍵
t.Columns = new Column[] { id }.Concat(t.Columns);
t.IdentityColumn = id;
t.PrimaryKey = new IColumn[] { id };
t.Keys = new IEnumerable<IColumn>[] { t.PrimaryKey };
}
var rowGuid = new RowGuidColumn(); // uniqueidentifier
var modifiedDate = new ModifiedDateColumn(); // datetime, 默認 getdate()
t.RowGuidColumn = rowGuid;
t.Columns = t.Columns.Concat(new Column[] { rowGuid, modifiedDate });
}
這對應 SSMS **Database Diagram** 中的完整對象結構,比純 SQL 腳本更豐富 (標識 Identity/RowGuid/ModifiedDate 語義)。
string script = new Script.Create.Database(db).ToString();
輸出片段:
CREATE TABLE [Person](
[PersonID] Int NOT NULL IDENTITY,
[Name] NVarChar(50) NOT NULL,
[Age] Int NOT NULL,
[ProfessionID] Int NOT NULL,
[rowguid] UniqueIdentifier NOT NULL,
[ModifiedDate] DateTime NOT NULL,
CONSTRAINT [PK_Person_1] PRIMARY KEY CLUSTERED ([PersonID] ASC) ...
)
CREATE TABLE [Profession]( ... )
ALTER TABLE [Person] ADD CONSTRAINT [FK_Person_Profession_ProfessionID]
FOREIGN KEY ([ProfessionID]) REFERENCES [Profession]([ProfessionID]) ...
string name = "AdventureWorks2008";
string folder = @"C:\MyDbs"; // 必須有寫入權限
string mdfPath = Path.Combine(folder, name + ".mdf");
using (var physical = ExpressDatabase.Create(
name, mdfPath, true,
OnDisposeTask.DetachDatabaseAndKeepFiles)) {
physical.RunScript(script, null);
}
LINQS 展示了「Schema as Code」的工程化價值 — 讓數據庫結構享受與業務代碼同等的重構、測試、版控待遇。