SubSonic和多个提供商的问题

时间:2009-04-10 16:29:56

标签: subsonic

我有两个用于两个不同数据库的亚音速生成的数据访问层,我在一个项目中使用,所以我在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”),因此当它应该读取时会出现类似“无效对象名称'dbo.Users'”的错误来自“BLLDB”(尽管我在Select())中明确指定了“BLLDB”

e.g。检查以下代码中的“BLLDB”DAL:

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

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

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

是什么给了??

6 个答案:

答案 0 :(得分:1)

您的某个提供商失败了。亚力学并不善于告诉你失败的原因和原因。

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

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

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

  3. 让我知道它是怎么回事。

答案 1 :(得分:1)

您可以使用以下命令指定哪个提供程序是默认的:

&LT; SubSonicService defaultProvider =“BLLDB”&gt;

答案 2 :(得分: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 OR,你可以在SubSonicService配置中指定。默认的dataProvider是你想要使用的那个,一切正常:

<SubSonicService enableTrace="false" defaultProvider="DB1" templateDirectory="">

但是,如果省略“defaultProvider”,它默认为提供者列表中的最后一个(在本例中为DB2)

多个DAL案例的另一个重要信息 - 如果您为每个提供程序生成不同文件夹中的代码,请务必在项目中“仅包含”一个自动生成的“AllStructs.cs”文件每个文件夹(否则,编译错误)。

仅供参考:对这个开源替代Codesmith的开发人员表示赞赏。到目前为止(除了这个问题),它很容易上手并使其工作(特别是使用SubStage)。此外,我认为它最终将成为我的客户更轻,更具成本效益的解决方案。谢谢!

答案 3 :(得分: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>

答案 4 :(得分:0)

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

即。它只读取BLLDB而不是BLLDB2

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

您是否有可能将用于亚音速的web.config条目发布到哪个供应商可以正常工作?

万分感谢!

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

e.g。

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

然后我做:

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

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

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

答案 5 :(得分:0)

在这里回答我自己的问题..在使用VB.NET时,似乎确实 NOT 可以使用多个提供程序。

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

将不得不为我们中的一个人共同攻击我自己的那个。尽管欢呼!