• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
a_a
Forget patterns, embrace creative.
            管理     

使用LINQS 0.0.6描述数据库模型和创建数据库

大家好,a_a写文档的经验有限,不过从今天开始我会尝试将刚刚发布的LINQS 0.0.6通过文档介绍给大家。 其实使用LINQS应该是件非常简单惬意的事情,今天我们先来看看其中最简单的描述数据库模型并通过它来创建物理数据库。 在开始前,也许您会愿意通过发布文档了解一下“什么是LINQS 0.0.6”,以及使用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是如何工作的。

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

posted @ 2009-04-02 00:37  a_a  阅读(1898)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3