惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - a_a

开源发布F#写的人工智能AI项目。 【庆祝VS2010的发布】发布一个F#开发的仿按键精灵功能开源项目 基于Silverlight 3的类Visio绘图软件发布第一个版本 明天发布一个基于Silverlight的类Visio小型绘图工具项目。 开始“工作流设计器” LINQS: Supporting translation reversing in following builds. - a_a "描述知识" { LINQS 0.0.7 } 描述结构并创建数据库,SQL Server 2008 Toolkit发布第一个版本。 LINQS 0.0.6.x bug在此反馈 LINQS 0.0.6 [α] 发布 “xp”中对多语言资源的支持 QQForce第一个版本发布 F#的火星人问题 语义研究(开源)项目启动中 MSDN群组讨论资源分享计划启动中 牛年更牛!贴年画、吉祥话大赛! LINQS、xp、xb等开源项目的来龙去脉。 [团购]《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》团购活动~ ;") TestSuite 0.0.2a源码发布。(http://www.codeplex.com/ts)
使用LINQS 0.0.6描述数据库模型和创建数据库
a_a · 2009-04-02 · via 博客园 - a_a

大家好,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是如何工作的。

这只是刚刚开始,接下来几天里a_a会带来一些更有趣的东西,敬请关注,如果您遭遇了bug,请前往这里反馈。