O / R将单个任意SQL SELECT语句映射到单个类?

时间:2011-04-29 15:03:35

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

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

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

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

似乎我的问题的答案在于了解ORM工具;

  • 那里有一个ORM工具可以做我需要的工作,或者
  • 你能解释一下Entity Framework如何从Views和Stored Procedures自动生成它的.NET类?
  • 或者,如果你能为我的场景提出另一个自动生成类的解决方案,那也将不胜感激。

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

3 个答案:

答案 0 :(得分:1)

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

编辑:

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

答案 1 :(得分:0)

如果使用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;
    }
}

这无助于您自动生成类本身。尽管如此,它仍然是提取您需要的数据的起点。

答案 2 :(得分:-1)

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