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

6

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

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

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

现在我想在运行时更改此表名,以便 SQL 将针对其他表运行 (例如,customers2008 而不是 customer)。
是否有任何方法可以在运行时更改表名 (源名称)?
[更新] 经过一些测试,我不得不发现 XmlMappingSource 渲染未在数据库中持久化的计算属性无法访问 (是的,即使是 SqlMetal 创建的映射也会忽略所有未持久化的内容)。
2个回答

7
您需要像这样做:
  1. 在设计器中创建实体。
  2. 使用 SqlMetal 从设计器生成的 .dbml 文件生成一个 xml 映射文件。
  3. 更新 xml 文件中的表名。
  4. 然后在您的代码中,使用 DataContext 构造函数重载,该函数接受使用 xml 映射文件创建的 XmlMappingSource。
这篇博客文章详细介绍了这个过程的步骤: http://weblogs.asp.net/guybarrette/archive/2008/07/23/linq-to-sql-dynamic-mapping.aspx 我正在使用类似的过程处理 ERP 数据库,该数据库具有类似于 ttccom001xxx 的表名,其中 xxx 是安装 ID(我知道这是一个可怕的模式,但我无能为力)。我们有多个安装,因此我将初始 xml 映射复制一次并替换 xxx 为安装 ID。 我编写了一个小型控制台应用程序,使用 Regex 处理替换,并将其作为我的构建过程的一部分添加。

现在我只需要一种在运行时创建这些映射文件的方法,这样我就不必试图让映射文件与数据类保持对齐了。 - Sam
哦,好吧,我设法创建了这些文件,但不幸的是,它们并没有按预期工作。现在时间不多了,明天再说吧。 - Sam
我建议在后期构建事件中创建XML映射,而不是在运行时创建。 - jrummell
即使使用SqlMetal创建的映射文件,DataContext也会变得无法使用,因为它们禁用了未在数据库中持久化的计算属性。遗憾。 - Sam
你在部分类中添加了这些属性吗?如果是这样,它们仍然应该是可访问的。但是,您将无法在查询中使用它们,因为它们不映射到数据库中的列。这对于基于xml和属性的映射都是正确的。 - jrummell

3

你不巧有一个链接或一些资源,可以告诉我如何在运行中的程序中创建映射文件吗? - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接