【问题标题】:Cross Database Join with Linq - Updating T4 template to support DB name?使用 Linq 进行跨数据库连接 - 更新 T4 模板以支持数据库名称?
【发布时间】:2013-08-22 03:13:08
【问题描述】:

我目前在多数据库 SQL Server 环境中运行,并使用 linq to sql 执行查询。

我正在使用此处记录的方法来实现跨数据库连接: http://www.enderminh.com/blog/archive/2009/04/25/2654.aspx

基本上就是这样:

2 数据上下文 - 用户和付款

Users.dbo.UserDetails {PK: UserId }
Payments.dbo.CurrentPaymentMethod { PK: UserId }

我将表拖到 DBML 上,然后在属性窗口中,将 Source 从 dbo.UserDetails 更改为 Users.dbo.UserDetails 以完全限定 DB 名称。

然后我可以通过执行以下操作发出单个数据上下文跨 DB 连接:

var results = (from user in datacontext.Table<UserDetail>()
        join paymentmethod in dataContext.Table<CurrentPaymentMethod>() on user.UserId equals paymentmethod.UserId
    ... rest of query here ...);

现在这是票券,可以按我的意愿工作。我目前遇到的唯一问题是架构更新等发生时(这相对频繁,因为我们处于重要的开发阶段)。

(最后是问题!) 当我将任何表拖到 Source 自动拾取的数据上下文时,我想要实现的目标(并且我已将问题标记为 T4 作为猜测,因为我知道 DBML 文件是 T4 引导的)是一种自动化方式数据库名称(所以会有 Users.dbo.UserDetails 而不仅仅是 dbo.UserDetails)?

感谢任何指点:)

特里

【问题讨论】:

    标签: linq linq-to-sql t4 cross-database


    【解决方案1】:

    查看T4 Toolbox 和它提供的 LinqToSql 代码生成器(Oleg Sych 提供)- 您可以自定义模板以生成任何您喜欢的引用,但我认为您将要解决的问题遇到的是数据库名称未存储在 dbml 文件中。

    您可能会做的是向生成器添加一个过滤器,可能使用字典或类似工具,这样在您的 .tt 文件中,您可以维护一个表列表和它们所属的数据库。这样,如果您的维护任务是从设计器中删除该类并重新放置,它将获得正确的数据库名称。

    【讨论】:

    • 嗨,彼得,感谢您的回复,我赞成它,因为它看起来永远不会收到答案。我已经看过 T4 Toolbox,虽然它非常强大(我们将它用于从数据库中的查找表中生成枚举),但在这种情况下并不能真正解决我的问题。我现在不得不满足于解决方法,因为我也在linkedin上问过这个问题,并且得到了很多很好的讨论,但是如果没有创造大量的工作就没有切实的答案。不过再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多