到目前为止,我们还未涉及任何数据库的配置工作。本章节将简单介绍基于Apworks的应用程序的数据库配置。在SQL Server中(目前的Apworks版本仅支持SQL Server)创建两个数据库:TinyLibraryEventDB和TinyLibraryQueryDB,然后分别执行如下SQL脚本:
-
TinyLibraryEventDB
1: USE TinyLibraryEventDB;2: /****** Object: Table [dbo].[DomainEvents] Script Date: 12/24/2010 20:27:20 ******/3: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DomainEvents]') AND type in (N'U'))4: DROP TABLE [dbo].[DomainEvents]5: GO6: /****** Object: Table [dbo].[Snapshots] Script Date: 12/24/2010 20:27:20 ******/7: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Snapshots]') AND type in (N'U'))8: DROP TABLE [dbo].[Snapshots]9: GO10: /****** Object: Table [dbo].[Snapshots] Script Date: 12/24/2010 20:27:20 ******/11: SET ANSI_NULLS ON12: GO13: SET QUOTED_IDENTIFIER ON14: GO15: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Snapshots]') AND type in (N'U'))16: BEGIN17: CREATE TABLE [dbo].[Snapshots](18: [Id] [bigint] IDENTITY(1,1) NOT NULL,19: [Timestamp] [datetime] NOT NULL,20: [SnapshotData] [varbinary](max) NOT NULL,21: [AggregateRootId] [bigint] NOT NULL,22: [AggregateRootType] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NOT NULL,23: [SnapshotType] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NOT NULL,24: [Version] [bigint] NOT NULL,25: [Branch] [bigint] NOT NULL,26: CONSTRAINT [PK_Snapshots] PRIMARY KEY CLUSTERED27: (28: [Id] ASC29: )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)30: )31: END32: GO33: /****** Object: Table [dbo].[DomainEvents] Script Date: 12/24/2010 20:27:20 ******/34: SET ANSI_NULLS ON35: GO36: SET QUOTED_IDENTIFIER ON37: GO38: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[DomainEvents]') AND type in (N'U'))39: BEGIN40: CREATE TABLE [dbo].[DomainEvents](41: [Id] [bigint] IDENTITY(1,1) NOT NULL,42: [AggregateRootId] [bigint] NOT NULL,43: [AggregateRootType] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,44: [Timestamp] [datetime] NOT NULL,45: [Version] [bigint] NOT NULL,46: [Branch] [bigint] NOT NULL,47: [TargetType] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,48: [Data] [varbinary](max) NOT NULL,49: CONSTRAINT [PK_DomainEvents] PRIMARY KEY CLUSTERED50: (51: [Id] ASC52: )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)53: )54: END55: GO -
TinyLibraryQueryDB
1: USE TinyLibraryQueryDB;2: /****** Object: Table [dbo].[Books] Script Date: 12/14/2010 14:12:31 ******/3: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Books]') AND type in (N'U'))4: DROP TABLE [dbo].[Books]5: GO6: /****** Object: Table [dbo].[Readers] Script Date: 12/14/2010 14:12:31 ******/7: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Readers]') AND type in (N'U'))8: DROP TABLE [dbo].[Readers]9: GO10: /****** Object: Table [dbo].[Registrations] Script Date: 12/14/2010 14:12:31 ******/11: IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Registrations]') AND type in (N'U'))12: DROP TABLE [dbo].[Registrations]13: GO14: /****** Object: Table [dbo].[Registrations] Script Date: 12/14/2010 14:12:31 ******/15: SET ANSI_NULLS ON16: GO17: SET QUOTED_IDENTIFIER ON18: GO19: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Registrations]') AND type in (N'U'))20: BEGIN21: CREATE TABLE [dbo].[Registrations](22: [Id] [bigint] IDENTITY(1,1) NOT NULL,23: [BookId] [bigint] NOT NULL,24: [ReaderId] [bigint] NOT NULL,25: [ReaderName] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,26: [ReaderLoginName] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,27: [BookTitle] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,28: [BookPublisher] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,29: [BookPubDate] [datetime] NOT NULL,30: [BookISBN] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,31: [BookPages] [int] NOT NULL,32: [RegistrationDate] [datetime] NULL,33: [DueDate] [datetime] NULL,34: [ReturnedDate] [datetime] NULL,35: [Returned] [bit] NULL,36: CONSTRAINT [PK_Registrations] PRIMARY KEY CLUSTERED37: (38: [Id] ASC39: )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)40: )41: END42: GO43: /****** Object: Table [dbo].[Readers] Script Date: 12/14/2010 14:12:31 ******/44: SET ANSI_NULLS ON45: GO46: SET QUOTED_IDENTIFIER ON47: GO48: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Readers]') AND type in (N'U'))49: BEGIN50: CREATE TABLE [dbo].[Readers](51: [Id] [bigint] IDENTITY(1,1) NOT NULL,52: [LoginName] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,53: [Name] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,54: [AggregateRootId] [bigint] NOT NULL,55: CONSTRAINT [PK_Readers] PRIMARY KEY CLUSTERED56: (57: [Id] ASC58: )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)59: )60: END61: GO62: /****** Object: Table [dbo].[Books] Script Date: 12/14/2010 14:12:31 ******/63: SET ANSI_NULLS ON64: GO65: SET QUOTED_IDENTIFIER ON66: GO67: IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Books]') AND type in (N'U'))68: BEGIN69: CREATE TABLE [dbo].[Books](70: [Id] [bigint] IDENTITY(1,1) NOT NULL,71: [Title] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,72: [Publisher] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,73: [PubDate] [datetime] NOT NULL,74: [ISBN] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,75: [Pages] [int] NOT NULL,76: [Lent] [bit] NULL,77: [AggregateRootId] [bigint] NOT NULL,78: [LendTo] [nvarchar](255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,79: CONSTRAINT [PK_Books] PRIMARY KEY CLUSTERED80: (81: [Id] ASC82: )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)83: )84: END85: GO
由于我们所使用的数据库系统是SQL Server,对于上面的TinyLibraryEventDB而言,它就是直接使用的Apworks应用开发框架中自带的SQL脚本。开发人员可以在Apworks的安装目录中找到该脚本文件。
就关系型数据库而言,我们需要一个额外的步骤去维护对象与数据表的映射关系。Apworks采用的是XML Storage Mapping Schema来维护这样的关系。
-
向TinyLibrary.Services项目添加一个新的XML文件,将其更名为DomainEventStorageMappings.xml,然后输入下面的内容
1: <?xml version="1.0" encoding="utf-8"?>2: <StorageMappingSchema>3: <DataTypes>4: <DataType FullName="Apworks.Events.Storage.DomainEventDataObject" MapTo="DomainEvents">5: <Properties>6: <Property Name="Id" MapTo="Id" Identity="true" AutoGenerate="true"/>7: </Properties>8: </DataType>9: <DataType FullName="Apworks.Events.Storage.SnapshotDataObject" MapTo="Snapshots">10: <Properties>11: <Property Name="Id" MapTo="Id" Identity="true" AutoGenerate="true"/>12: </Properties>13: </DataType>14: </DataTypes>15: </StorageMappingSchema> -
向TinyLibrary.Services项目添加一个新的XML文件,将其更名为QueryObjectStorageMappings.xml,然后输入下面的内容
1: <?xml version="1.0" encoding="UTF-8"?>2: <StorageMappingSchema>3: <DataTypes>4: <DataType FullName="TinyLibrary.QueryObjects.ReaderObject" MapTo="Readers">5: <Properties>6: <Property Name="Id" MapTo="Id" Identity="true" AutoGenerate="true"/>7: </Properties>8: </DataType>9: <DataType FullName="TinyLibrary.QueryObjects.BookObject" MapTo="Books">10: <Properties>11: <Property Name="Id" MapTo="Id" Identity="true" AutoGenerate="true"/>12: </Properties>13: </DataType>14: <DataType FullName="TinyLibrary.QueryObjects.RegistrationObject" MapTo="Registrations">15: <Properties>16: <Property Name="Id" MapTo="Id" Identity="true" AutoGenerate="true"/>17: <Property Name="BookAggregateRootId" MapTo="BookId"/>18: <Property Name="ReaderAggregateRootId" MapTo="ReaderId"/>19: </Properties>20: </DataType>21: </DataTypes>22: </StorageMappingSchema>
以下是这些XML文件的XSD结构,这个XSD Schema也被包含在Apworks应用开发框架的安装目录中。
1: <?xml version="1.0" encoding="UTF-8"?>
2: <!-- edited with XMLSpy v2009 (http://www.altova.com) by Administrator (EMBRACE) -->
3: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
4: <xs:element name="StorageMappingSchema">
5: <xs:annotation>
6: <xs:documentation>Represents the schema for storage mapping.</xs:documentation>
7: </xs:annotation>
8: <xs:complexType>
9: <xs:sequence minOccurs="0">
10: <xs:element ref="DataTypes"/>
11: </xs:sequence>
12: </xs:complexType>
13: </xs:element>
本文详细介绍了如何使用Apworks应用开发框架配置数据库,包括创建TinyLibraryEventDB和TinyLibraryQueryDB数据库,执行SQL脚本创建必要的表,并通过XMLStorageMappingSchema维护对象与数据表的映射关系。

被折叠的 条评论
为什么被折叠?



