跨数据库加入Linq - 更新T4模板以支持数据库名称?

时间:2011-04-28 09:32:22

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

我目前正在多数据库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上,然后在属性窗口中,将源代码从dbo.UserDetails更改为Users.dbo.UserDetails,以完全限定数据库名称。

然后,我可以通过执行以下操作来发布单个数据上下文跨数据库连接:

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

现在这是一个蠢的嘘声,按照我的意愿行事。我目前遇到的唯一问题是架构更新等发生时(由于我们处于重要的开发阶段,因此相对频繁)。

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

感谢您的任何指示:)

特里

1 个答案:

答案 0 :(得分:1)

查看它提供的T4 Toolbox和LinqToSql代码生成器(由Oleg Sych提供) - 您可以自定义模板以生成您想要的参考,但我认为您的问题要碰到的是数据库名称没有存储在dbml文件中。

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