O / R-сопоставить один произвольный оператор SQL SELECT с одним классом? - PullRequest
1 голос
/ 29 апреля 2011

Я не очень разбираюсь в механике работы инструментов ORM , но, работая с Entity Framework (EF), я знаю, что каким-то образом можно автоматически генерировать CLRклассы из произвольных представлений хранятся в базе данных.В EF эти классы автоматически генерируются из вашей модели сущностей.EF может даже получить информацию о столбце из хранимой процедуры и сгенерировать новый «сложный тип» из этой информации.

  • Как можно автоматически генерировать классы .NET, используя только (1) предоставленную информациюоператором SELECT SQL и (2) возможностью запрашивать у базы данных ее метаданные?

Поскольку SQL хранится в базе данных, мы знаем во время компиляции, что такое SQL SELECT.Точно так же Entity Framework знает, что такое SELECT SQL для View или хранимой процедуры во время компиляции.Мы хотим автоматически генерировать классы .NET, зная SELECT SQL и запрашивая метаданные базы данных.Мне нужно иметь возможность преобразовать итоговый единственный DataTable в автоматически сгенерированные классы.

Кажется, что ответ на мой вопрос заключается в знании инструментов ORM;

  • Существует ли инструмент ORM, который уже может делать то, что мне нужно, или
  • Не могли бы вы объяснить, как Entity Framework автоматически генерирует свои классы .NET из представлений и хранимых процедур?
  • Или, если вы можете придумать другое решение для автоматической генерации классов для моего сценария, это также будет оценено.

Если требуется какое-либо разъяснение, просто дайте мне знать.

Ответы [ 3 ]

1 голос
/ 29 апреля 2011

Метаданные о таблицах и представлениях загружаются из системных представлений: sys.tables, sys.views, sys.columns и другие .

Редактировать:

Я простопроверил, как EF получает имена и типы столбцов и действительно выполняет хранимую процедуру и выполняет итерацию по возвращенным столбцам.Он использует только некоторые сложные запросы для правильной сборки команды вызова и обработки возвращаемого значения.

0 голосов
/ 04 мая 2011

Я понял, как это сделать. Я написал очень простое решение для этого здесь .

0 голосов
/ 29 апреля 2011

На самом деле вам не нужен ORM для этого, если вы используете пространство имен System.Data.SqlClient. Вот быстрый пример, который работает для произвольных операторов запроса:

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;
    }
}

Это не поможет вам автоматически генерировать классы как таковые. Тем не менее, это отправная точка для получения данных, которые вам понадобятся для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...