如何在运行时更改LINQ O / R-M表名/源?

时间:2009-02-24 15:39:04

标签: .net linq linq-to-sql

我有一个数据库,以及一个由O / R-Mapper创建的实体集,使用所有这些与LINQ。

在O / R-Mapper中,我需要为每个表输入一个表名(source),该表用于LINQ生成的SQL。在.dbml文件中,它看起来像这样:

<Table Name="dbo.Customers" Member="Customers">

现在我想在运行时更改此表名,因此SQL将针对其他表运行(例如,customers2008而不是客户)。

有没有办法在运行时更改表名(源名称)?

[更新]经过一些测试让我感到沮丧之后我不得不发现XmlMappingSource确实渲染了数据库中没有持久存储的计算属性(是的,即使是SqlMetal创建的映射也会忽略所有未持久的映射)。

2 个答案:

答案 0 :(得分:7)

有点......你必须做这样的事情:

  1. 在设计器中创建实体。
  2. 使用SqlMetal从设计器生成的.dbml文件生成xml映射文件。
  3. 更新xml文件中的表名。
  4. 然后在您的代码中,使用DataContext构造函数重载,该重载接受使用xml映射文件创建的XmlMappingSource。
  5. 这是一篇博客文章,逐步解释了这个过程: http://weblogs.asp.net/guybarrette/archive/2008/07/23/linq-to-sql-dynamic-mapping.aspx

    我在ERP数据库中使用类似的过程,其中包含ttccom001xxx这样的表名,其中xxx是安装ID(我知道这是一个可怕的架构,但我无能为力)。我们有多个安装,因此我为每个安装复制一次初始xml映射,然后用安装ID替换xxx。我写了一个小型控制台应用程序,它使用Regex来处理替换,并将其作为构建过程的一部分添加。

答案 1 :(得分:3)

以下是Microsoft External Mapping Reference的链接。

  

外部映射会覆盖基于属性的映射。

这是必需品。

  1. 创建一些代表您的映射的xml。
  2. 新建XmlMappingSource并将其提供给您的xml。
  3. 构造DataContext时,请使用接受XmlMappingSource的构造函数,例如this one