自定义Linq到SQL映射源

本文关键字:映射 SQL Linq 自定义 | 更新日期: 2023-09-27 18:01:13

我有一个项目,它将编译的实体框架域与动态定义的外部数据库混合在一起。用户可以在运行时提供连接字符串、表名和列名以访问外部系统。我以前一直在使用动态生成的SQL来访问外部系统(当然,为了避免SQL注入,我精心制作了(,并将感兴趣的表读取到DataTable的表中,并将其具体化为POCO的表。

现在,我90%的视图使用IQueryable对象来检查DB查询的结构,并有效地格式化/分页/操作视图。这使我能够在执行查询之前对做大量的工作。对于涉及外部系统记录的视图,我只是咬紧牙关,使用IEnumerable.AsQueryable()

我非常想使用不同的解决方案。我倾向于Linq-to-SQL(我对其他建议持开放态度(,但我一直致力于创建动态MappingSource。此外,有些列是可选的,如果我不为每一列提供映射,我不知道Linq到SQL是否会崩溃。

public class ExternalMappingSource : MappingSource
{
    public string[] KeyColumns { get; set; }
    public string NameColumn { get; set; }
    public string DescriptionColumn { get; set; }
    public string TimestampColumn { get; set; }
    protected override MetaModel CreateModel(Type dataContextType)
    {
        // ???
    }
}

我在网上找不到任何好的资源。我该如何打发这节课?

自定义Linq到SQL映射源

如果您预先了解相关结构(表和字段值(,则可以基于该数据输入自定义映射源,而无需事先获得对象。对我来说,出于另一个原因,我最终使用了XmlMappingSource对象,因为它有一个.FromXml((方法,您可以使用它来输入任意Xml。如果检查sqlmetal:生成的映射文件,您可以了解所需Xml的结构

  • 打开VS命令提示符(它位于"开始"菜单中的Visual Studio Tools文件夹中(
  • 将目录更改为您的项目
  • 输入命令"sqlmetal/map:whatever.map/code yourlinqtosql.dbml"。这将生成一个格式化为Xml的whatever.ma普文件

根据需要以编程方式进行更改,以提供给XmlMappingSource.FromXml((方法。然后,您可以使用相关的连接字符串和更改后的映射源创建上下文。