Linq to Entities在运行时控制表名解析

时间:2011-02-12 22:50:25

标签: linq-to-entities devart

我已经实现了一个处理某种对象的内容管理系统,现在客户端已经引入了另一种对象,其结构和行为完全相同,但是是分开的。他们希望能够切换模式,其中每个模式的行为相同,除了一个处理一个对象类型而另一个处理另一个对象类型。

假设第一个对象类型存储在名为TBL_OBJECT的表中,第二个对象存储在名为TBL_OBJECT_NEW的表中。我正在寻找一种方法来使用我现有的代码,但能够即时切换并将其切换到另一个表。因为结构相同,所以这在概念上是可行的。唯一的问题是在L2E中,表名保存为属性并编译进来,所以我正在寻找一种方法来挂钩sql语句创建过程,以便我现有的语句如下:

Dim db as New DataContext
Dim query = From obj in db.Objects

将解析为TBL_OBJECT_NEW表而不是TBL_OBJECT表。如果我能做到这一点,我可以重用大量的代码。我知道这是一个有点不寻常的情况,但我真的希望它是可能的。任何帮助非常感谢!感谢。

顺便说一句,我正在使用DevArt的LinqConnect;我不知道一个简单的L2E方法将适用于此。另一方面,如果您知道如何使用DevArt而不是L2E,那仍然会非常有用。

1 个答案:

答案 0 :(得分:1)

我们不知道有两个相同的表映射到一个概念实体的可能性。

LinqConnect和实体框架中都有一个解决方案。例如,您可以尝试在只有一个差异的两个模型之间切换(第一个模型将映射TBL_OBJECT,第二个模型将映射到TBK_OBJECT_NEW)。

LinqConnect解决方案

要在LinqConnect中使用相同结构在不同表之间切换,您可以为当前DataContext实例创建两个.lqml文件并从其中一个加载映射:

string mappingFileName;
if (...) // Check whether TBL_OBJECT_A should be used
  mappingFileName = "MyDataContext_A.lqml";
else 
  mappingFileName = "MyDataContext_B.lqml";
Stream contextStream = System.IO.File.OpenRead(mappingFileName);
System.Data.Linq.Mapping.MappingSource mappingSource =
Devart.Data.Linq.Mapping.XmlMappingSource.FromStream(contextStream);
MyDataContext context = new MyDataContext(connectionString, mappingSource);

此外,我们计划支持流畅的映射(在您的代码中设置映射而不使用属性或映射文件的方法),但目前无法为此提供任何时间范围。您可以在我们的UserVoice投票赞成此功能。

实体框架解决方案

将Metadata Artifact Processing属性设置为CopyToOutputDirectory。在此之后转到生成的SSDL文件并将表名从“TBL_OBJECT”更改为“TBL_OBJECT_NEW”。 现在唯一的事情是使用正确的连接字符串创建上下文(您可以将新的连接字符串添加到应用程序配置文件或将整个连接字符串传递给ObjectContext构造函数)。