我有两个用于两个不同数据库的亚音速生成的数据访问层,我在一个项目中使用,所以我在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”
是什么给了??
答案 0 :(得分:1)
您的某个提供商失败了。亚力学并不善于告诉你失败的原因和原因。
我通常会以几种方式进行调试。
一次只使用一个提供商并对另一个提供商进行评论。检查您是否能够看到命名空间。如果它们都加载正常,那么你至少知道它不是数据库。
检查是否有任何表以 - ,_或数字开头。这也可能导致它失败。
让我知道它是怎么回事。
答案 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并排工作
将不得不为我们中的一个人共同攻击我自己的那个。尽管欢呼!