In this article I will explain with an example, how to insert (save) data (records) to database by calling Stored Procedure using Entity Framework in ASP.Net MVC Razor.
First the multiple rows (records) will be insert into an HTML Table and then the data from all the rows of the HTML Table will be sent to Controller using jQuery AJAX which will be ultimately saved to database by calling Stored Procedure using Entity Framework in ASP.Net MVC Razor.
Note: For beginners in ASP.Net MVC and Entity Framework, please refer my article ASP.Net MVC: Simple Entity Framework Tutorial with example. It covers all the information needed for connecting and configuring Entity Framework.
 
 
Database
I have made use of the following table Customers with the schema as follows. CustomerId is an Auto-Increment (Identity) column.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
Note: You can download the database table SQL by clicking the download link below.
          Download SQL file
 
 

Stored Procedure for inserting data into Database
The following Stored Procedure will be used to insert data into the SQL Server database table.
This Stored Procedure will be called using Entity Framework.
CREATE PROCEDURE [dbo].[Insert_Customer]
      @Name VARCHAR(100) = NULL
      ,@Country VARCHAR(100) = NULL
AS
BEGIN
      SET NOCOUNT ON;
      DECLARE @CustomerId INT
 
      INSERT INTO Customers(Name, Country)
      VALUES (@Name, @Country)
 
      SET @CustomerId = SCOPE_IDENTITY()
      SELECT @CustomerId [CustomerId]
END
 
 
Entity Framework Model
Once the Entity Framework is configured and connected to the database table, the Model will look as shown below.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
 
Importing the Stored Procedure
Next step is to import the Stored Procedure by Right Clicking and selecting Update Model from Database option as shown below.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
Then the Stored Procedure to be added needs to be selected and the Finish Button must be clicked.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
Note: The above two steps are not required if the Stored Procedure has been added while creating the Entity Data Model.
 
Finally, in order to call the Stored Procedure using Entity Framework, the Stored Procedure needs to be imported as a Function. Thus, again Right Click and select Add and then click on Function Import option.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
This will open the Add Function Import dialog window where the Function Name and the Stored Procedure to be imported as Function is selected.
Finally, the Scalar RadioButton is selected and the Int32 option is chosen from the DropDown.
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
 
Controller
The Controller consists of two Action methods.
Action method for handling GET operation
Inside this Action method, all the records from the Customers table is returned to the View as a Generic List collection.
 
Action method for inserting multiple records
Inside this Action method, the JSON array of Customers records is received as Generic List Collection of Customer Entity Class objects.
First all the records of the Customers Table are deleted by using the TRUNCATE command and then a loop is executed over the Generic List Collection of Customer Entity Class objects and one by one records are inserted into database by calling Stored Procedure using Entity Framework.
Finally the count of the records are returned back to the jQuery AJAX function.
public ActionResult Index()
{
    CustomersEntities entities = new CustomersEntities();
    return View(entities.Customers);
}
 
public JsonResult InsertCustomers(List<Customer> customers)
{
    using (CustomersEntities entities = new CustomersEntities())
    {
        //Truncate Table to delete all old records.
        entities.Database.ExecuteSqlCommand("TRUNCATE TABLE [Customers]");
 
        //Check for NULL.
        if (customers == null)
        {
            customers = new List<Customer>();
        }
 
        //Loop and insert records.
        int insertedRecords = 0;
        foreach (Customer customer in customers)
        {
            int customerId = entities.InsertCustomer(customer.Name, customer.Country).FirstOrDefault().Value;
            insertedRecords++;
        }
 
        return Json(insertedRecords);
    }
}
 
 
View
Inside the View, in the very first line the Entity Framework Customer Model class is declared as Model for the View.
Display
For displaying the records, an HTML Table is used. A loop will be executed over the Model which will generate the HTML Table rows with the Customer records.
The HTML Table consists of the following elements:
1. THEAD – The Header row.
2. TBODY – Left empty for dynamically adding (inserting) rows to the HTML Table.
3. TFOOT – The footer row, consisting of two TextBoxes and a Button for dynamically adding (inserting) rows to the HTML Table.
 
Adding a new row
When Add button in the Footer row of the HTML Table is clicked, the value of the Name and Country are fetched from their respective TextBoxes and are added as a new row to the HTML Table.
 
Removing a row
When the Remove button in any row of the HTML Table is clicked, it calls the Remove method which removes the row from the HTML Table.
Note: For more details on adding and remove rows from HTML Table using jQuery, please refer my article Add (Insert) / Remove (Delete) Table Rows dynamically using jQuery.
 
Inserting multiple rows to database using AJAX
When the Save All button is clicked, a loop is executed over all the rows of the HTML Table and a JSON array of Customer objects is generated.
The JSON array is then sent to the Controller using jQuery AJAX function and once the response is received it is displayed using JavaScript Alert Message Box.
@model IEnumerable<Insert_Stored_Proc_EF_MVC.Customer>
 
@{
    Layout = null;
}
 
<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Index</title>
</head>
<body>
    <table id="tblCustomers" class="table" cellpadding="0" cellspacing="0">
        <thead>
            <tr>
                <th style="width:150px">Name</th>
                <th style="width:150px">Country</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (Customer customer in Model)
            {
                <tr>
                    <td>@customer.Name</td>
                    <td>@customer.Country</td>
                    <td><input type="button" value="Remove" onclick="Remove(this)"/></td>
                </tr>
            }
        </tbody>
        <tfoot>
            <tr>
                <td><input type="text" id="txtName"/></td>
                <td><input type="text" id="txtCountry"/></td>
                <td><input type="button" id="btnAdd" value="Add"/></td>
            </tr>
        </tfoot>
    </table>
    <br/>
    <input type="button" id="btnSave" value="Save All"/>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js"></script>
    <script type="text/javascript">
        $("body").on("click", "#btnAdd", function () {
            //Reference the Name and Country TextBoxes.
            var txtName = $("#txtName");
            var txtCountry = $("#txtCountry");
 
            //Get the reference of the Table's TBODY element.
            var tBody = $("#tblCustomers > TBODY")[0];
 
            //Add Row.
            var row = tBody.insertRow(-1);
 
            //Add Name cell.
            var cell = $(row.insertCell(-1));
            cell.html(txtName.val());
 
            //Add Country cell.
            cell = $(row.insertCell(-1));
            cell.html(txtCountry.val());
 
            //Add Button cell.
            cell = $(row.insertCell(-1));
            var btnRemove = $("<input />");
            btnRemove.attr("type", "button");
            btnRemove.attr("onclick", "Remove(this);");
            btnRemove.val("Remove");
            cell.append(btnRemove);
 
            //Clear the TextBoxes.
            txtName.val("");
            txtCountry.val("");
        });
 
        function Remove(button) {
            //Determine the reference of the Row using the Button.
            var row = $(button).closest("TR");
            var name = $("TD", row).eq(0).html();
            if (confirm("Do you want to delete: " + name)) {
                //Get the reference of the Table.
                var table = $("#tblCustomers")[0];
 
                //Delete the Table row using it's Index.
                table.deleteRow(row[0].rowIndex);
            }
        };
 
        $("body").on("click", "#btnSave", function () {
            //Loop through the Table rows and build a JSON array.
            var customers = new Array();
            $("#tblCustomers TBODY TR").each(function () {
                var row = $(this);
                var customer = {};
                customer.Name = row.find("TD").eq(0).html();
                customer.Country = row.find("TD").eq(1).html();
                customers.push(customer);
            });
 
            //Send the JSON array to Controller using AJAX.
            $.ajax({
                type: "POST",
                url: "/Home/InsertCustomers",
                data: JSON.stringify(customers),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (r) {
                    alert(r + " record(s) inserted.");
                }
            });
        });
    </script>
</body>
</html>
 
 
Screenshot
Insert (Save) data (records) to database using Stored Procedure in ASP.Net MVC
 
 
Downloads