SubSonic 使用 DbProviderFactory 模式。DbProviderFactory 方法允许在不知道具体类型的情况下创建 Connections/Commands/...。
// without factory
var con = new MySqlConnection();
var cmd = new MySqlCommand();
// with factory
var factory = DbProviderFactories.GetFactory("MySql.Data.MySqlClient");
var con = factory.CreateConnection();
var cmd = factory.CreateCommand();
这是一种更通用的方法。
但是,为了使其工作,您必须安装 MySql.Data(msi-Package),它会在machine.config
文件中创建一些条目。
也就是说,
我也更喜欢我的构建环境不依赖于已安装的软件,这使得在不安装多个依赖项的情况下切换到新机器变得更加容易。
但这需要一些工作:
修改您的 app.config/web.config 文件并将其放在<configuration>
和之间的某个位置</configuration>
<system.data>
<DbProviderFactories>
<remove invariant="MySql.Data.MySqlClient"/>
<add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient"
description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.4.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
</DbProviderFactories>
</system.data>
我刚刚复制并粘贴了来自
%windir%\Microsoft.NET\Framework\<version>\Config
安装 MSI 后。
如果您的解决方案有多个项目,您必须对主项目(以便 subsonic 可以在运行时找到您的提供程序)和您的 DAL 项目(以便 subsonic 可以在代码生成期间找到您的提供程序)执行此操作。
如果你使用另一个 MySQL 版本,你可以改变它。
您要做的第二件事是告诉模板在哪里可以找到 MySql.Data.dll(如果它不在 GAC 中)。
您可以通过编辑MySQL.ttinclude
文件来做到这一点(查看assembly
指令)
<#@ include file="Settings.ttinclude" #>
<#@ assembly name="$(SolutionDir)\Dependencies\MySql.Data.dll" #>
<#@ import namespace="MySql.Data.MySqlClient" #>
<#+
通过这些更改,我的解决方案运行 find 并且模板生成也可以在没有安装任何 MySql 组件的全新安装上运行。