ASP.NET MVC: лучший способ вызвать хранимую процедуру - PullRequest
12 голосов
/ 23 ноября 2010

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

Я новичок в ASP.NET MVC и много читал о Linq to SQL и Entity Framework., а также шаблон репозитория.Если честно, мне трудно понять реальные различия между L2S и EF ... но я хочу убедиться, что то, что я создаю в моем приложении, правильно.

На данный момент,Мне нужно правильно вызывать хранимые процедуры, чтобы: а) сохранить некоторую информацию о пользователе и получить ответ, и б) получить некоторую информацию для каталога продуктов.

До сих пор я создал Linq to SQL.dbml файл, выбрал sotred процедуру из проводника сервера и перетащил этот экземпляр в .dbml.В настоящее время я называю хранимую процедуру следующим образом:

MyLinqModel _db = new MyLinqModel();
_db.MyStoredProcedure(args);

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

Может кто-нибудь узнать, какие у меня проблемы?

Ответы [ 5 ]

19 голосов
/ 23 ноября 2010

LINQ и EF, вероятно, излишни, если все, что вы пытаетесь сделать, это вызвать сохраненный процесс.

Я использую Enterprise Library, но ADO.NET также будет работать нормально.

См. этот урок .

Кратко (бесстыдно скопировано и вставлено из ссылочной статьи):

    SqlConnection conn = null;
    SqlDataReader rdr  = null;

    // typically obtained from user
    // input, but we take a short cut
    string custId = "FURIB";

    Console.WriteLine("\nCustomer Order History:\n");

        // create and open a connection object
        conn = new SqlConnection("Server=(local);DataBase=Northwind; Integrated Security=SSPI");
        conn.Open();

        // 1.  create a command object identifying
        //     the stored procedure
        SqlCommand cmd  = new SqlCommand(
            "CustOrderHist", conn);

        // 2. set the command object so it knows
        //    to execute a stored procedure
        cmd.CommandType = CommandType.StoredProcedure;

        // 3. add parameter to command, which
        //    will be passed to the stored procedure
        cmd.Parameters.Add(
            new SqlParameter("@CustomerID", custId));

        // execute the command
        rdr = cmd.ExecuteReader();

        // iterate through results, printing each to console
        while (rdr.Read())
        {
            Console.WriteLine(
                "Product: {0,-35} Total: {1,2}",
                rdr["ProductName"],
                rdr["Total"]);
        }
    }

Обновление

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

Нет, это не правильный способ сделать это.

Ваш контроллер должен быть действительно вовлечен только в построение оркестрированного представления. Создайте отдельную библиотеку классов, которая называется «Уровень доступа к данным» или что-то менее общее, и создайте класс, который будет обрабатывать вызовы сохраненных процедур, создание объектов из результатов и т. Д. Существует много мнений о том, как это следует обрабатывать, но, возможно, Наиболее распространенным является:

View
|
Controller
|
Business Logic
|
Data Access Layer
   |--- SQL (Stored procs)
           -Tables
           -Views
           -etc.
   |--- Alternate data sources
           -Web services
           -Text/XML files
           -blah blah blah.

MSDN имеет достойный учебник по теме.

3 голосов
/ 21 марта 2015

Попробуйте это:

Чтение:

var authors = context.Database.SqlQuery<Author>("usp_GetAuthorByName @AuthorName", 
new SqlParameter("@AuthorName", "author"));

Обновление:

var affectedRows = context.Database.ExecuteSqlCommand
("usp_CreateAuthor @AuthorName = {0}, @Email= {1}", 
"author", "email");

По этой ссылке: http://www.dotnetthoughts.net/how-to-execute-a-stored-procedure-with-entity-framework-code-first/

И я быперейдите с фреймворком, упомянутым Дэвидом Лайвли, вместо того, чтобы подпрограммы в контроллере.Просто передайте результаты обратно как IEnumerable<blah> из функции в отдельном классе репозитория для редактирования, передайте логическое значение обратно, если обновление завершилось успешно для обновления.

2 голосов
/ 23 ноября 2010

LINQ to SQL и ADO.NET EF присоединяют хранимые процедуры чтения к классу контекста данных / объекта, который вы используете, чтобы идти вразрез с его различными сущностями. Для создания, обновления и удаления вы можете создать процедуру, которая отображает свойства сущности, которую генерирует модель, и с помощью окна сопоставления сущностей (прямо сейчас забудьте точное имя) вы можете сопоставить поля сущностей с параметрами процедуры , Итак, скажем, у вас есть таблица «Клиенты», EF генерирует сущность «Клиенты», и вы можете сопоставить параметры процедуры со свойствами сущности «Клиент» при попытке обновить / вставить / удалить.

Теперь вы можете сопоставить процесс CUD с функцией, но я не знаю всех последствий; Мне нравится, как я только что упомянул лучшее.

НТН.

0 голосов
/ 24 ноября 2010

Я не могу представить, что ваша цель - вызвать хранимую процедуру. Для меня это звучит так, как будто вам нужно забыть хранимые процедуры и использовать Linq to Sql. Я говорю L2S, потому что EF гораздо больше для изучения, и в этом случае он не нужен.

0 голосов
/ 23 ноября 2010

Обычно я передаю интерфейс репозитория в ваш контроллер путем внедрения зависимостей.Выбор используемой вами технологии персистентности / орма - это действительно другая проблема, не связанная с тем, что вы используете MVC.Использование шаблона репозитория и кодирование для абстракций (интерфейсов) упрощает тестирование вашего приложения путем макетирования ваших репозиториев.

Я думаю, вам также следует попытаться использовать как можно меньше хранимых процедур.Это означает, что вы можете легче тестировать свою логику в отдельности (модульные тесты) без необходимости подключения к базе данных.Я очень рекомендую посмотреть на NHibernate.Кривая обучения довольно крутая, но вы полностью контролируете свои отображения и конфигурацию.Очевидно, что в некоторых случаях вам понадобятся хранимые процедуры для повышения производительности, но использование ORM преимущественно очень полезно.

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