自定义 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)