自定义 Linq-to-SQL 映射源

Posted

技术标签:

【中文标题】自定义 Linq-to-SQL 映射源【英文标题】:Custom Linq-to-SQL MappingSource 【发布时间】:2013-02-27 00:37:11 【问题描述】:

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

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

我非常想使用不同的解决方案。我倾向于 Linq-to-SQL(我愿意接受其他建议),但我坚持创建动态 MappingSource。另外,有些列是可选的,我不知道如果我不为每一列提供映射,Linq-to-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)
    
        // ???
    

我无法在网上找到任何好的资源。我如何冲出这门课?

【问题讨论】:

【参考方案1】:

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

打开 VS 命令提示符(它位于开始菜单的 Visual Studio 工具文件夹中)。 将目录更改为您的项目。 输入命令“sqlmetal /map:whatever.map /code yourlinqtosql.dbml”。这会生成一个带有格式化 Xml 的whatever.map 文件。

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

【讨论】:

我考虑过XmlMappingSource,但我必须即时生成 XML。生成 XML 只是为了在下一行解析它似乎很浪费。 +1 建议,但我宁愿直接配置“MappingSource”。 明白。无论如何,您都会或多或少地手动操作映射。 :( 我最终决定自定义MappingSource 所花费的时间比我当前的发布时间表所允许的要长。目前,我将使用您的解决方案并将生成的 XML 保存在数据库中,以避免每次需要访问外部系统时都必须重新创建它。感谢您的帮助。 没问题。我很难过你不得不放弃,但很高兴它对你有用。

以上是关于自定义 Linq-to-SQL 映射源的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义访问者时自定义类型的 Boost 变体失败(源自 boost::static_visitor)

如何将 LINQ-to-SQL 映射到 BLL 类?

Gradle插件开发 APK瘦身资源自定义7z压缩

自定义枚举 --- MyBatis字段映射

Matplotlib imshow与自定义色彩映射(例如自定义地图和自定义缩放)

Mybatis-自定义Enum映射