我对ORM工具如何工作的机制知之甚少,但是通过使用Entity Framework(EF),我知道以某种方式可以从存储的任意视图自动生成CLR类在数据库中。在EF中,这些类是从您的实体模型自动生成的。 EF甚至可以从存储过程中获取列信息,并根据此信息生成新的“复杂类型”。
因为SQL存储在数据库中,所以我们在编译时知道SELECT SQL是什么。类似地,Entity Framework知道View或存储过程的SELECT SQL在编译时是什么。我们希望通过了解SELECT SQL并查询数据库的元数据来自动生成.NET类。我需要能够将生成的单个DataTable转换为自动生成的类。
似乎我的问题的答案在于了解ORM工具;
如果需要澄清,请告诉我。
答案 0 :(得分:1)
有关表和视图的元数据是从系统视图加载的:sys.tables
,sys.views
,sys.columns
和others。
编辑:
我刚刚测试了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写了一个非常基本的解决方案。