1

我有两个 Subsonic 生成的数据访问层,用于我在一个项目中使用的 2 个不同的数据库,因此我的 web.config 中有以下内容:

<SubSonicService>
    <providers>
      <add name="BLLDB" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="BLLDB" generatedNamespace="BLLDB" useSPs="true" />
      <add name="BLLDB2" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="BLLDB2" generatedNamespace="BLLDB2" useSPs="true" />
    </providers>
  </SubSonicService>

然而,每当我调用任一 DAL 的代码时,它总是最终使用列出的第二个数据提供程序(“BLLDB2”),因此当它应该从“BLLDB "(尽管我在 Select() 中明确指定了“BLLDB”)

例如,检查“B​​LLDB”DAL 的以下代码:

Dim mySelect As New
SubSonic.Select(Databases.BLLDB)
mySelect.From(Of User)()

“mySelect.ProviderName”返回一个字符串值:“BLLDB2”

而“Databases.BLLDB”返回一个字符串值:“BLLDB”

是什么赋予了??

4

6 回答 6

1

您的供应商之一失败了。亚音速不善于告诉你它失败的原因和位置。

我通常通过几种方式进行调试。

  1. 一次只使用一个提供者并评论另一个。检查您是否能够看到命名空间。如果它们都加载正常,那么您至少知道它不是数据库。

  2. 检查是否有任何表格以 -、_ 或数字开头。这也可能导致它失败。

让我知道事情的后续。

于 2009-04-10T16:36:20.597 回答
1

您可以使用以下方法指定默认提供程序:

< SubSonicService defaultProvider="BLLDB" >

于 2009-04-10T18:38:05.780 回答
1

我是 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)。此外,我认为它最终会成为我的客户更轻、更经济的解决方案。谢谢!

于 2009-05-22T19:29:56.267 回答
1

我正在使用亚音速 2.2 子级。您需要尊重地更改多个提供者的名称空间。

一件重要的事情。它将生成多个“AllStructs.vb”文件。它将由代码自动重复。但是你需要添加一个 allstructs.vb 另一个只是删除它会工作 1000%。

这将是 web 配置文件中的配置设置。

 <connectionStrings>
    <add name="aspnetdb" connectionString="Data Source=(local); Database=aspnetdb; Integrated Security=true;"/>
    <add name="office" connectionString="Data Source=(local); Database=office; Integrated Security=true;"/>
</connectionStrings>
<SubSonicService defaultProvider="aspnetdb" enableTrace="false" templateDirectory="">
    <providers>
        <clear/>
        <add name="aspnetdb" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="aspnetdb"/>
        <add name="office" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="office"/>
    </providers>
</SubSonicService>
于 2011-12-09T19:13:19.677 回答
0

只是在这里回答我自己的问题.. 在通过 VB.NET 工作时似乎确实不可能使用多个提供程序。

这可能只适用于 C#(正如 CodeToGlory 提到的),因为我已经从头开始测试了几种不同的场景,并且无法让 2 个 Subsonic 生成的 DAL 并排工作

将不得不为其中一个破解我自己的,所以.. 为建议干杯!

于 2009-04-14T12:34:09.990 回答
0

大家好,感谢您的回复... Rob,如果我指定“BLLDB”的默认提供程序,这最终会做同样的事情,但是对于 BLLDB 而不是 BLLDB2

即它只读取 BLLDB 而不是 BLLDB2

CodeToGlory,我使用的是最新的 dll,并且在遇到这个问题之前,运行 SubSonic 通常没有问题。

您是否可以张贴您用于亚音速的 web.config 条目,您有两个提供商都在工作?

太感谢了!

PS 当我在我的 Select() 函数中直接指定要使用哪个数据提供者时,这也很奇怪:

例如

Dim mySelect As New SubSonic.Select(Databases.BLLDB)
mySelect.From(Of User)()

然后我做:

“mySelect.ProviderName”,这将返回一个字符串值:“BLLDB2” (不正确)

而当我输出“Databases.BLLDB”的值时,这将返回一个字符串值:“BLLDB” (正确)

这实际上可能是问题的关键......

于 2009-04-11T13:26:09.483 回答