【问题标题】:O/R-map a single arbitrary SQL SELECT statement to a single class?将单个任意 SQL SELECT 语句 O/R 映射到单个类?
【发布时间】:2011-05-05 04:54:26
【问题描述】:

我不太了解ORM 工具如何工作的机制,但是通过使用Entity Framework (EF),我知道从存储在数据库中的任意视图自动生成CLR 类是有可能的。在 EF 中,这些类是从您的实体模型自动生成的。 EF 甚至可以从存储过程中获取列信息,并根据这些信息生成新的“复杂类型”。

  • 如何仅使用 (1) SQL SELECT 语句提供的信息和 (2) 查询数据库以获取其元数据的能力自动生成 .NET 类?

因为 SQL 存储在数据库中,所以我们在编译时就知道 SELECT SQL 是什么。同样,实体框架在编译时知道视图或存储过程的 SELECT SQL 是什么。我们希望通过了解 SELECT SQL 并查询数据库的元数据来自动生成 .NET 类。我需要能够将生成的单个 DataTable 转换为自动生成的类。

看来我的问题的答案在于了解 ORM 工具;

  • 是否有 ORM 工具可以满足我的需求,或者
  • 您能否解释一下 Entity Framework 如何从视图和存储过程中自动生成其 .NET 类?
  • 或者,如果您能为我的场景提出另一种自动生成类的解决方案,我们将不胜感激。

如果需要任何澄清,请告诉我。

【问题讨论】:

标签: c# sql entity-framework orm ado.net


【解决方案1】:

关于表和视图的元数据从系统视图中加载:sys.tablessys.viewssys.columnsothers

编辑:

我刚刚测试了 EF 如何获取列名和类型,它确实执行存储过程并迭代返回的列。它只使用一些复杂的查询来正确构建调用命令和处理返回值。

【讨论】:

  • 单击“获取列信息”后(顺便问一下,EF 如何从存储的过程中获取此列信息?),单击“创建复杂类型”,实体框架会自动生成新的复杂类型类。它在designer.cs文件中
  • 是的,之前我在运行 SQL Server 分析器时发现了这一点。我现在正在为这个问题建立一个解决方案,这并不难。它将使用这些信息加上 T4 文本模板来生成我需要的类。
【解决方案2】:

如果您使用 System.Data.SqlClient 命名空间,您实际上并不需要 ORM 来执行此操作。下面是一个适用于随机查询语句的简单粗暴的示例:

public static List<string> GetColumns(string connectionString, string queryString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        SqlDataAdapter adapter = new SqlDataAdapter();
        adapter.SelectCommand = new SqlCommand(queryString, connection);

        connection.Open();
        List<string> columnNames = new List<string>();
        SqlDataReader reader = adapter.SelectCommand.ExecuteReader();
        for (int xx = 0; xx < reader.FieldCount; xx++)
        {
            columnNames.Add(reader.GetName(xx));
        }
        return columnNames;
    }
}

这并不能帮助您自动生成类本身。尽管如此,它仍然是提取所需数据的起点。

【讨论】:

    【解决方案3】:

    我想出了如何做到这一点。我为此here 写了一个非常基本的解决方案。

    【讨论】:

    • 链接失效,信息应直接在答案中。
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多