Использование ASP.NET MVC без ORM - PullRequest
10 голосов
/ 03 мая 2009

В моем приложении ASP MVC я использую стандартный SQL (а не Linq to SQL или другой ORM) для запросов к моей базе данных.

Я хотел бы передать результаты базы данных в мое представление и перебрать результаты в моем представлении. Но я не уверен, как это сделать. Каждый пример, который я видел, передает некоторую строку или использует L2S. Я хотел бы передать что-то вроде вложенных Hashtables, но единственное, о чем я могу думать, это передать объект SqlDataReader в представление, но это звучит как очень плохая идея.

Как бы я показал результаты своей базы данных из стандартного запроса SQL в моем представлении? Мне бы очень хотелось использовать Linq или другой ORM, но требования диктуют, что мы этого не делаем (не спрашивайте меня, почему, я не понимаю). Я делаю это в VB. Я постараюсь преобразовать любые предоставленные примеры C #.

Ответы [ 5 ]

12 голосов
/ 03 мая 2009

Вы можете создать простые классы для данных, которые вы хотите передать, а затем вручную заполнить список объектов в вашем контроллере из устройства чтения данных, а затем передать его в свой View - например, (C #, но это должно быть легко конвертировать)

// open your connection / datareader etc.

List<Customer> customers = new List<Customer>();

while(dataReader.Read())
{
 Customer c = new Customer();
 c.Id = dataReader.GetInt32(0);
 c.Name = dataReader.GetString(1);
 // etc (you might want to use string indexers instead of ints for the get methods)

 customers.Add(c);
}

// close and dispose your datareader / connection etc as usual

return View("List", customers);
8 голосов
/ 03 мая 2009

Я согласен с Рашаком. Эта статья объясняет это в некоторых деталях. текст ссылки

В двух словах, как это сделать с помощью DataTable и DataReader:

private DataTable GetData()
{
    DataTable dt = new DataTable();

    using (SqlConnection connection
             = new SqlConnection("ConnectionString"))
    using (SqlCommand command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandText = "SELECT * FROM Customers";

        connection.Open();
        using (SqlDataReader reader =
            command.ExecuteReader
                (CommandBehavior.CloseConnection))
        {
            dt.Load(reader);
        }
    }

    return dt;
}

Затем вы можете прочитать эту DataTable в объект сущности, который вы передаете.

Я думаю, вы обнаружите, что это может дать гораздо лучшую производительность, чем использование Linq или ORM.

8 голосов
/ 03 мая 2009

MVC о разделении интересов. Передача SqlDataReaders, DataTables или любого другого класса, который находится в пространстве имен System.Data, представлению не является хорошей идеей. Вам необходимо определить модель, которая может взаимодействовать с базой данных, и контроллер, который передаст эту модель в представление. Если политика вашей компании гласит, что не используйте ORM, то, возможно, классические веб-формы лучше подходят для вашего сценария, чем шаблон MVC.

5 голосов
/ 03 мая 2009

Попробуйте использовать DataTables - DataTable может загружать данные из IDataReader ... (я думаю, метод называется Load)

4 голосов
/ 03 мая 2009

Вы можете создать свои собственные Объекты передачи данных классов и заполнить их экземпляры, используя код ADO.Net. Эти классы DTO будут простыми POCO -стилями, которые просто содержат методы доступа get / set, а не методы. Использование объектов POCO, вероятно, предпочтительнее DataSets / DataTables, поскольку они легки (без лишнего состояния) и более интуитивны для работы с объектно-ориентированной точки зрения.

...