我是 Subsonic 的新手(使用带有 C# 的 2.2 版)。我花了很多时间试图获得与 Stimpy 相同的配置。我想我想通了-我的解决方案如下。如果这是正确的,最好将此信息添加到 Select Queries 文档中。所以其他人可以更早地解决这个多数据提供者问题。这是web.config
<SubSonicService enableTrace="false" templateDirectory="">
<providers>
<clear/>
<add name="DB1" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="DB1" excludeProcedureList="*" generatedNamespace="DB1" includeTableList="TableA" tableBaseClass="RepositoryRecord"/>
<add name="DB2" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="DB2" excludeProcedureList="*" generatedNamespace="DB2" includeTableList="TableB,TableC" tableBaseClass="RepositoryRecord"/>
</providers>
这是不起作用的语句(取自 Select Queries 文档示例)。SQL Server 找不到“TableA”,因为它在 DB2 而不是 DB1 中寻找它:
DB1.TableA doesntWork = new Select().From<DB1.TableA>().
Where("idCol").IsEqualTo(1).ExecuteSingle<DB1.TableA>();
(我的假设是每个表的 dataProvider 将作为表类的属性生成)。
这是使这项工作起作用的修改:
Select mySelect = DB1.DB.Select();
DB1.TableA works = mySelect.From<DB1.TableA>().
Where("idCol").IsEqualTo(1).ExecuteSingle<DB1.TableA>();
或者,这也有效:
DB1.TableA worksAlso = new Select(DataService.GetInstance(Databases.DB1)).From<DB1.TableA>().
Where("idCol").IsEqualTo(1).ExecuteSingle<DB1.TableA>();
似乎如果您有一个 dataProvider 或者您在 SubSonicService 配置中指定。默认 dataProvider 是您尝试使用的,一切正常:
<SubSonicService enableTrace="false" defaultProvider="DB1" templateDirectory="">
但是,如果您省略“defaultProvider”,它默认为提供者列表中的最后一个(在本例中为 DB2)
多 DAL 案例的另一条重要信息 - 如果您将代码生成到每个提供程序的不同文件夹中,请确保在您的项目中仅“包含”一个自动生成到每个文件夹中的“AllStructs.cs”文件(否则,编译错误)。
仅供参考:向 Codesmith 的这种开源替代方案的开发人员表示敬意。到目前为止(除了这个问题),很容易上手并使其工作(尤其是使用 SubStage)。此外,我认为它最终会成为我的客户更轻、更经济的解决方案。谢谢!