使用LINQS 0.0.6描述数据库模型和创建数据库
大家好,a_a写文档的经验有限,不过从今天开始我会尝试将刚刚发布的LINQS 0.0.6通过文档介绍给大家。
其实使用LINQS应该是件非常简单惬意的事情,今天我们先来看看其中最简单的描述数据库模型并通过它来创建物理数据库。
在开始前,也许您会愿意通过发布文档了解一下“什么是LINQS 0.0.6”,以及使用LINQS 0.0.6的基本需求。
一、描述一个简单的名片数据库模型:
首先添加对Katmai项目和Xbb.Data.SqlServerModel.Katmai命名空间的引用,这个命名空间提供SQL Server 2008业务对象的描述服务。
var profession = new Table { Name = "Profession", Columns = new IColumn[] { new Column { Name = "Name", Type = new NVarChar(50) } } }; var r = 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 } };
这段代码描述了名片数据库中的专业(类型)和人物两个表以及我们关心的一些列,下面这段代码帮我们创建“ID”、“RowGuid”和最后修改时间等系统列:
foreach (var t in r.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 { }; var modifiedDate = new ModifiedDateColumn { }; t.RowGuidColumn = rowGuid; t.Columns = t.Columns.Concat(new Column[] { rowGuid, modifiedDate }); }
至此一份数据库模型描述就完成了,大家可以在源代码中的“_Katmai\Katmai\Katmai\Descriptor\Sample.cs”中找到类似的描述以及更多的作为案例的数据库描述。
在上面这段代码中我们看到的Table的IdentityColumn、PrimaryKey、Keys等属性是根据在Database Diagram设计视图(SQL Server Management Studio和Visual Studio Team Suite中集成)中的对象结构映射的,这比SQL脚本语言中的结构更加细致完整。
二、输出建库代码:
Xbb.Data.SqlServerModel.Katmai.Script.Create命名空间提供了对各种SQL Server 2008对象描述生成SQL脚本的服务,生成的脚本可以用于创建数据库中的实际对象。
string script = new Script.Create.Database(r).ToString();
很简单对吗?输出应该会类似于:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO 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 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO CREATE TABLE [Profession]( [ProfessionID] Int NOT NULL IDENTITY, [Name] NVarChar(50) NOT NULL, [rowguid] UniqueIdentifier NOT NULL, [ModifiedDate] DateTime NOT NULL, CONSTRAINT [PK_Profession_1] PRIMARY KEY CLUSTERED ( [ProfessionID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [Person] ADD CONSTRAINT [FK_Person_Profession_ProfessionID] FOREIGN KEY ([ProfessionID]) REFERENCES [Profession]([ProfessionID]) ON DELETE NO ACTION
请查阅源代码中的“_Katmai\KatmaiTest\KatmaiTest\ScriptTest.cs”,这里执行了类似的测试,并且提供了更多案例。
三、创建数据库:
Xbb.Data.SqlServerModel.Katmai.Physical命名空间提供了对本地安装的SQL Server Express 2008数据库软件的操作能力,可以代您对物理数据库进行创建和维护。
string name = "AdventureWorks2008", d = /* 选择一个文件夹来创建数据库文件,请注意必须是您有写权限的文件夹,例如“我的文档”或“桌面”下的某个子文件夹。 */, databaseFile = Path.Combine(d, name + ".mdf"); using (var physical = ExpressDatabase.Create(name, databaseFile, true, OnDisposeTask.DetachDatabaseAndKeepFiles)) { physical.RunScript(script, null); };
在这之后,您可以在您指定的文件夹中找到刚刚创建的数据库文件了。“_Katmai.Physical\Katmai.Physical.Test\Katmai.Physical.Test\ExpressDatabaseTest.cs”提供了更多测试来演示ExpressDatabase是如何工作的。