疑难解惑指南 - 如何使用其他类型的数据库?

优质
小牛编辑
145浏览
2023-12-01

Serenity 有方言系统(dialect system)以支持在非 Sql Server 的其他数据库中工作。

方言系统(Dialect system)目前还是一项在不断完善的实验性功能。虽然它也能工作,但如果有任何问题,你可以在 Serenity 的 GitHub 向我们反馈。

如果你需要支持多种数据库类型,只需在 web.config 修改连接字符串,并在表达式中小心使用数据库特定的功能及避免使用保留的关键字。

PostgreSQL

注册 Npgsql 提供者

PostgreSQL 有一个名为 Npgsql 的 .NET 提供者。你首先需要在 MyProject.Web 中安装该提供者:

Install-Package Npgsql -Project MyProject.Web

如果你之前没有在 GAC/machine.config 安装该提供者,或者不想在此安装,你需要在 web.config 文件配置:

  1. <configuration>
  2. // ...
  3. <system.data>
  4. <DbProviderFactories>
  5. <remove invariant="Npgsql"/>
  6. <add name="Npgsql Data Provider"
  7. invariant="Npgsql"
  8. description=".Net Data Provider for PostgreSQL"
  9. type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral,
  10. PublicKeyToken=5d8b90d52f46fda7"
  11. support="FF" />
  12. </DbProviderFactories>
  13. </system.data>
  14. // ...

设置连接字符串

下一步是把连接字符串修改为 Postgres 数据库的配置:

确保你使用自己的服务器信息替换连接字符串的对应参数值。

  1. <connectionStrings>
  2. <add name="Default" connectionString="
  3. Server=127.0.0.1;Database=serene_default_v1;
  4. User Id=postgres;Password=yourpassword;"
  5. providerName="Npgsql" />
  6. <add name="Northwind" connectionString="
  7. Server=127.0.0.1;Database=serene_northwind_v1;
  8. User Id=postgres;Password=yourpassword;"
  9. providerName="Npgsql" />
  10. </connectionStrings>

由于 Postgres 总会将字母转换为小写,所以请使用小写的数据库名称,如 serene_default_v1

提供者名称必须是 Npgsql ,以使 Serenity 自动检测方言。

注意标识符的大小写

PostgreSQL 的标识符区分大小写。

FluentMigrator 自动为所有标识符添加引号,所以数据库中的表和列名称将被添加引号并区分大小写。当试图检索不带引号的表或列标识符时,可能会导致问题。

一种做法是在迁移中始终使用小写字母标识符,但这种命名方案在其它数据库类型中不是很好,因此我们不喜欢这种方式。

为了防止 Postgres 的这类问题,Serenity 有自动添加引号功能,以解决 Postgres/FluentMigrator 的兼容问题,但需要在应用程序的 SiteInitialization.cs 启动方法中启用:

  1. public static void ApplicationStart()
  2. {
  3. try
  4. {
  5. SqlSettings.AutoQuotedIdentifiers = true;
  6. Serenity.Web.CommonInitialization.Run();

确保在 CommonInitialization.Run 运行之前设置 AutoQuotedIdentifiers 。

该设置自动为实体的列名称添加引号,但不能应用在手工编写的表达式中(如,表达式特性)。

如果你想支持多数据库类型,在表达式中对标识符使用方括号 [] 。 Serenity 在运行查询之前,将自动把方括号转为数据库具体的引用类型(quote type)。

你可能还希望在表达式中使用双引号,但它不能与 MySQL 数据库兼容。

设置默认方言

这一步骤是可选的。

Serenity 通过检索连接字符串的 providerName 自动决定使用的方言。

它甚至可以在同一时间与多个数据库类型工作。

例如,Northwind 使用 Sql Server,而 Default 使用 PostgreSQL。

但是,如果你打算每个站点只使用一种数据库类型,可以在 SiteInitialization 注册默认使用的数据库类型。

  1. public static void ApplicationStart()
  2. {
  3. try
  4. {
  5. SqlSettings.DefaultDialect = PostgresDialect.Instance;
  6. SqlSettings.AutoQuotedIdentifiers = true;
  7. Serenity.Web.CommonInitialization.Run();

当连接方言/实体等不能自动确定时,使用默认方言。

该设置不会覆盖自动检测,它只是被用作回退。

启动应用程序

现在启动你的应用程序,如果之前没有手工创建数据库,它将自动创建数据库。

配置代码生成器

Sergen 没有 PostgreSQL 提供者的引用,因此如果若想使用它生成代码,你必须向其注册该提供者。

Sergen.exe 是一个 exe 文件,因此你不能为它添加 NuGet 引用。我们需要在应用程序配置文件中注册该提供者。

也可以在 GAC/machine.config 注册提供者并完全跳过此步骤。

定位到 Sergen.exe,该文件在 packages/Serenity.CodeGenerator.1.8.6/tools 目录下,并创建文件 Sergen.exe.config ,然后向其添加如下内容:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.data>
  4. <DbProviderFactories>
  5. <remove invariant="Npgsql"/>
  6. <add name="Npgsql Data Provider"
  7. invariant="Npgsql"
  8. description=".Net Data Provider for PostgreSQL"
  9. type="Npgsql.NpgsqlFactory, Npgsql, Culture=neutral,
  10. PublicKeyToken=5d8b90d52f46fda7"
  11. support="FF" />
  12. </DbProviderFactories>
  13. </system.data>
  14. <appSettings>
  15. <add key="LoadProviderDLLs" value="Npgsql.dll"/>
  16. </appSettings>
  17. </configuration>

把 Npgsql.dll 拷贝到与 Sergen.exe 同一文件夹。现在 Sergen 将可以为 Postgres 表生成代码。

如果想能够使用多个数据库,你可能想删除 [public]. 前缀,该前缀是生成的行(rows)中 tablename/column 表达式的默认 schema 。

MySql

Serene 1.8.13+ 支持 MySql

注册 MySql 提供者

MySQL 有一个名为 MySql.Data 的 .NET 提供者。你首先需要在 MyProject.Web 中安装该提供者:

Install-Package MySql.Data -Project MyProject.Web

如果你之前没有在 GAC/machine.config 安装该提供者,或者不想在此安装,你需要在 web.config 文件配置(MySql.Data NuGet 程序包在安装时已经为我们添加了该配置):

  1. <configuration>
  2. // ...
  3. <system.data>
  4. <DbProviderFactories>
  5. <remove invariant="MySql.Data.MySqlClient"/>
  6. <add name="MySQL Data Provider"
  7. invariant="MySql.Data.MySqlClient"
  8. description=".Net Framework Data Provider for MySQL"
  9. type="MySql.Data.MySqlClient.MySqlClientFactory,
  10. MySql.Data, Culture=neutral,
  11. PublicKeyToken=c5687fc88969c44d" />
  12. </DbProviderFactories>
  13. </system.data>
  14. // ...

设置连接字符串

下一步是把连接字符串修改为 MySql 数据库的配置:

确保你使用自己的服务器信息替换连接字符串的对应参数值。

  1. <connectionStrings>
  2. <add name="Default" connectionString="
  3. Server=localhost; Port=3306; Database=Serene_Default_v1;
  4. Uid=root; Pwd=yourpass"
  5. providerName="MySql.Data.MySqlClient" />
  6. <add name="Northwind" connectionString="
  7. Server=localhost; Port=3306; Database=Serene_Northwind_v1;
  8. Uid=root; Pwd=yourpass"
  9. providerName="MySql.Data.MySqlClient" />
  10. </connectionStrings>

提供者名称必须是 MySql.Data.MySqlClient ,以使 Serenity 自动检测方言。注意,上述重写默认方言。

MySql 使用小写的数据库(schema)和表名称,但没有 Postgres 的区分大小写问题。

配置代码生成器

Sergen 没有 MySql 提供者的引用,因此如果你想使用它生成代码,你必须向其注册该提供者。

Sergen.exe 是一个 exe 文件,因此你不能为它添加 NuGet 引用。我们需要在应用程序配置文件中注册该提供者。

也可以在 GAC/machine.config 注册提供者并完全跳过此步骤。

定位到 Sergen.exe,该文件在 packages/Serenity.CodeGenerator.1.8.6/tools 目录下,并创建文件 Sergen.exe.config ,然后向其添加如下内容:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.data>
  4. <DbProviderFactories>
  5. <remove invariant="MySql.Data.MySqlClient"/>
  6. <add name="MySQL Data Provider"
  7. invariant="MySql.Data.MySqlClient"
  8. description=".Net Framework Data Provider for MySQL"
  9. type="MySql.Data.MySqlClient.MySqlClientFactory,
  10. MySql.Data, Culture=neutral,
  11. PublicKeyToken=c5687fc88969c44d" />
  12. </DbProviderFactories>
  13. </system.data>
  14. <appSettings>
  15. <add key="LoadProviderDLLs" value="MySql.Data.dll"/>
  16. </appSettings>
  17. </configuration>

把 MySql.Data.dll 拷贝到与 Sergen.exe 同一文件夹。现在 Sergen 将可以为 Postgres 表生成代码。

Oracle

Serene 2.2.2+ 已支持 Oracle 数据库

注册 Oracle 提供者

Oracle 有一个名为 Oracle.ManagedDataAccess 的托管 .NET 提供者。你首先需要在 MyProject.Web 中安装该提供者:

Install-Package Oracle.ManagedDataAccess -Project MyProject.Web

如果你之前没有在 GAC/machine.config 安装该提供者,或者不想在此安装,你需要在 web.config 文件配置(Oracle.ManagedDataAccess NuGet 程序包在安装时已经为我们添加了该配置):

  1. <configuration>
  2. // ...
  3. <system.data>
  4. <DbProviderFactories>
  5. <remove invariant="Oracle.ManagedDataAccess.Client"/>
  6. <add name="ODP.NET, Managed Driver"
  7. invariant="Oracle.ManagedDataAccess.Client"
  8. description="Oracle Data Provider for .NET, Managed Driver"
  9. type="Oracle.ManagedDataAccess.Client.OracleClientFactory,
  10. Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral,
  11. PublicKeyToken=89b483f429c47342"/>
  12. </DbProviderFactories>
  13. </system.data>
  14. // ...

创建数据库

Serene 不能在 Oracle 自动创建数据库(tablespace)。你需要自己创建它们,或者使用下面的脚本(我在 XE 运行该脚本):

  1. CREATE TABLESPACE Serene_Default_v1_TABS
  2. DATAFILE 'Serene_Default_v1_TABS.dat' SIZE 10M AUTOEXTEND ON;
  3. CREATE TEMPORARY TABLESPACE Serene_Default_v1_TEMP
  4. TEMPFILE 'Serene_Default_v1_TEMP.dat' SIZE 5M AUTOEXTEND ON;
  5. CREATE USER Serene_Default_v1
  6. IDENTIFIED BY somepassword
  7. DEFAULT TABLESPACE Serene_Default_v1_TABS
  8. TEMPORARY TABLESPACE Serene_Default_v1_TEMP;
  9. GRANT CREATE SESSION TO Serene_Default_v1;
  10. GRANT CREATE TABLE TO Serene_Default_v1;
  11. GRANT CREATE SEQUENCE TO Serene_Default_v1;
  12. GRANT CREATE TRIGGER TO Serene_Default_v1;
  13. GRANT UNLIMITED TABLESPACE TO Serene_Default_v1;
  14. CREATE TABLESPACE Serene_Northwind_v1_TABS
  15. DATAFILE 'Serene_Northwind_v1_TABS.dat' SIZE 10M AUTOEXTEND ON;
  16. CREATE TEMPORARY TABLESPACE Serene_Northwind_v1_TEMP
  17. TEMPFILE 'Serene_Northwind_v1_TEMP.dat' SIZE 5M AUTOEXTEND ON;
  18. CREATE USER Serene_Northwind_v1
  19. IDENTIFIED BY somepassword
  20. DEFAULT TABLESPACE Serene_Northwind_v1_TABS
  21. TEMPORARY TABLESPACE Serene_Northwind_v1_TEMP;
  22. GRANT CREATE SESSION TO Serene_Northwind_v1;
  23. GRANT CREATE TABLE TO Serene_Northwind_v1;
  24. GRANT CREATE SEQUENCE TO Serene_Northwind_v1;
  25. GRANT CREATE TRIGGER TO Serene_Northwind_v1;
  26. GRANT UNLIMITED TABLESPACE TO Serene_Northwind_v1;

设置连接字符串

你可能想要为 ORACLE 配置你的数据源。我在这里用 Express Edition (XE):

  1. <configuration>
  2. <oracle.manageddataaccess.client>
  3. <version number="*">
  4. <dataSources>
  5. <dataSource alias="XE"
  6. descriptor="
  7. (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)
  8. (HOST=localhost)(PORT=1521))
  9. (CONNECT_DATA=(SERVICE_NAME=XE))) "/>
  10. </dataSources>
  11. </version>
  12. </oracle.manageddataaccess.client>
  13. </configuration>

下一步是把连接字符串修改为 Oracle 数据库的配置:

确保你使用自己的服务器信息替换连接字符串的对应参数值。

  1. <connectionStrings>
  2. <add name="Default" connectionString="
  3. Data Source=XE;User Id=Serene_Default_v1;Password=somepassword;"
  4. providerName="Oracle.ManagedDataAccess.Client"/>
  5. <add name="Northwind" connectionString="
  6. Data Source=XE;User Id=Serene_Northwind_v1;Password=somepassword;"
  7. providerName="Oracle.ManagedDataAccess.Client"/>
  8. </connectionStrings>

提供者名称必须是 Oracle.ManagedDataAccess.Client ,以使 Serenity 自动检测方言。注意,上述重写默认方言。

配置代码生成器

Sergen 目前还不支持 Oracle,希望尽快支持……