4

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

现在,我 90% 的视图使用IQueryable对象来检查数据库查询的结构和格式/页面/有效地操作视图。这使我可以在执行查询之前对查询进行大量工作。对于涉及外部系统记录的视图,我只是咬紧牙关使用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)
    {
        // ???
    }
}

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

4

1 回答 1

4

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

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

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

于 2013-02-27T00:52:01.570 回答