【问题标题】:Subsonic - How to use SQL Schema / Owner name as part of the namespace?Subsonic - 如何使用 SQL 模式/所有者名称作为命名空间的一部分?
【发布时间】:2010-10-19 19:08:00
【问题描述】:

我刚刚开始使用 Subsonic 2.2,到目前为止印象非常深刻 - 认为它可以为我节省一些重要的编码时间。

在我开始全职使用它之前,虽然有一些困扰我的事情我想解决。

在我当前的数据库(一个 SQL2008 数据库)中,我已按架构/所有者名称将表、视图、sps 等拆分为单独的块,因此所有客户表都在客户中。架构,产品中的产品。架构等,因此要从客户地址表中进行选择,我会选择 * from customer.address

不幸的是,Subsonic 忽略了架构/所有者名称,只给了我基表名称。这很好,因为我在架构之间没有重复(例如 Customer.Address 和 Supplier.Address 都不存在),但我只是觉得如果我可以按架构拆分代码会更清晰。

理想情况下,我希望能够通过架构/所有者更改命名空间 - 我认为这对 SubSonic 的影响最小,但会使生成的代码更易于阅读。

问题是,我已经爬遍了 Subsonic 的源代码,但不知道如何做到这一点(我在 VB 而不是 C# 中编码并没有帮助 = 是的,我知道,怪罪于 ZX Spectrum !!)

如果有人以前解决过这个问题或对如何解决这个问题有想法,我将非常感激,

提前致谢。

埃德

【问题讨论】:

    标签: sql-server subsonic schema owner


    【解决方案1】:

    我也打算建议多提供者方法。 但是很多管道已经处于亚音速的所有权状态。 如果您在 CS_ClassTemplate.aspx 中编辑几行,您可以为每个所有者配置文件创建一个命名空间。将第 58 行(我使用的是 v2.1)更改为

    namespace <%=provider.GeneratedNamespace%><%=owner%>
    

    所有者在哪里

    string owner = "." + tbl.SchemaName;
    if(owner == ".dbo")
      owner = "";
    

    你把它放在上面,大约第 14 行。这样你就可以为每个所有者拥有一个命名空间,例如: Northwind.Suppliers、Northwind.Customers 等 我将 dbo 保留为 Northwind,因此无需进行大量编辑即可编译所有测试。 我运行了一个简单的选择查询,我认为它会按照您想要的方式工作。

    【讨论】:

    • 您还必须稍微修改一下 ODSController 和 Structs 生成器,但这很容易。
    • 我也有类似的情况。但是,由于在不同的模式中有一些具有相同名称的表,它会变得更加复杂。有什么办法解决吗?
    【解决方案2】:

    您也可以使用我们的 t4 模板在 3.0 中执行此操作(但仅限 3.5)。这是一个非常好的反馈——也许我们应该默认内置它!

    很高兴你在这里得到了一些帮助。

    【讨论】:

      【解决方案3】:

      只是为了让您知道我现在可以使用它 - 或者至少正在编译! :-) 要让所有者解决方案充分发挥作用,尽管您需要对类模板进行更多更改,否则表/键函数位于错误的命名空间中。

      我还对存储过程模板进行了修改。我无法(在很短的时间内)弄清楚如何为每个所有者拆分为单独的文件/命名空间,所以我在每个 sp 函数前加上所有者和下划线。

      但是,如果您遇到同样的问题,您会知道可以解决。

      埃德

      【讨论】:

        【解决方案4】:

        您可以尝试使用具有相同底层数据库连接的单独提供程序,如下所示:

        <SubSonicService defaultProvider="DBData">
        <providers>
        <clear/>
             <add name="DBData" type="Subsonic.SqlDataProvider, SubSonic" connectionStringName="LocalSqlServer" generatedNamespace="DBData" includeTableList="table_a,table_b" spStartsWith="app,get,set" viewStartsWith="v_" />
             <!--CMS Provider-->
             <add name="CMS" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="LocalSqlServer" generatedNamespace="CMS" stripTableText="CMS_" includeTableList="CMS_Content,CMS_Page" useSPs="false"/>
        </providers>
        </SubSonicService>
        

        我认为您不能以这种方式将架构本身用作键,但您至少可以通过结合使用 includeTableList 和 generatedNamespace 来解决这个问题。你说你在不同的模式中没有重复的表名,所以它可能会起作用。

        【讨论】:

        • 嗨,感谢您的快速回复 :-) 我总共有 6 个模式,从大量使用到轻型(配置内容)使用。有点担心到同一个数据库的 6 个独立连接。我脑后的小家伙说这是个坏主意,但不确定..
        猜你喜欢
        • 1970-01-01
        • 2014-12-11
        • 2019-11-12
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2020-08-27
        • 1970-01-01
        • 2011-03-14
        相关资源
        最近更新 更多