新手ASP.NET MVC 5模型存储过程繁重的后端建议

时间:2016-04-18 19:21:42

标签: c# asp.net-mvc asp.net-mvc-4 razor

我有一个企业应用程序,它严重依赖于业务逻辑的存储过程。我正在考虑将Webforms的前端重做到ASP.NET MVC,但我希望我不必为每个存储过程编写模型(有数百个)。通常,“Get”存储过程与等效的“set”存储过程没有相同的参数,并且通常单个存储过程正在更新多个数据库表。

所以我的问题是在这种后端构建ASP.NET MVC应用程序的最佳实践是什么?实体框架会为此工作吗?我肯定希望我不需要为每个存储过程构建100个模型,一个或两个......

我也正在考虑使用普通的剃刀网页和webdata的动态数据行模型,它可能更适合。但是我不能像Kendo UI那样使用整洁的东西(我想)。

提前感谢您的智慧。

2 个答案:

答案 0 :(得分:3)

实体框架将为您提供帮助。我建议先从数据库中执行代码。我不推荐使用MVC和Razor。我只是为业务逻辑构建一个库层(该层将利用您的存储过程)和服务层进行通信(该层只处理与客户端的通信,并将使用该库来获取或设置数据)。对于客户端,我会使用纯HTML和JavaScript,并使用Ajax调用来使用服务。

如果您的公司有支持Web套接字的服务器,我甚至会使用SignalR集线器而不是WebApi作为服务层。

答案 1 :(得分:1)

每个存储过程都不需要模型。

这完全取决于你想做什么。

当我使用存储过程将数据保存到数据库时,我会为每个要保存的值发送参数。

从db获取值时,我使用模型。你在这里使用的模型显然取决于你,如果你正在恢复文件数据,那么你可以拥有一个FileModel,imageData,ImageModel等。

示例:

我使用经理和服务类:

public void UpdateCustomerCredentials(long id, string firstName, string lastName, string email, string mobilePhoneNumber, int price, string notes, Guid? imageId = null)
{
    using (SqlConnection con = new SqlConnection(ConnectionString))
    {
        using (SqlCommand cmd = new SqlCommand("UpdateCustomer", con))
        {

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@Id", id));
            cmd.Parameters.Add(new SqlParameter("@FirstName", firstName));
            cmd.Parameters.Add(new SqlParameter("@LastName", lastName));
            cmd.Parameters.Add(new SqlParameter("@Email", email));
            cmd.Parameters.Add(new SqlParameter("@MobilePhoneNumber", mobilePhoneNumber));
            cmd.Parameters.Add(new SqlParameter("@ImageId", GetParamValue(imageId)));
            cmd.Parameters.Add(new SqlParameter("@Price", price));
            cmd.Parameters.Add(new SqlParameter("@Notes", notes));

            try
            {
                con.Open();

                cmd.ExecuteReader();

                con.Close();
            }
            catch (SqlException ex)
            {
                cmd.Dispose();
                throw ex;
            }

            finally
            {
                cmd.Dispose();
            }
        }
    }
}

使用客户模型获取数据:

    public List<Customer> GetAllCustomers()
    {
        List<Customer> customers;
        SqlDataReader sqlDataReader = null;

        using (SqlConnection con = new SqlConnection(ConnectionString))
        {
            using (SqlCommand cmd = new SqlCommand("GetAllCustomers", con))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                try
                {
                    con.Open();

                    sqlDataReader = cmd.ExecuteReader();

                    customers = (from x in sqlDataReader.Cast<DbDataRecord>()
                                 select new Customer
                                 {
                                     Id = GetValue<long>("Id", x),
                                     ProfileImageId = GetValue<Guid?>("ImageId", x),
                                     ContentType = GetValue<string>("ContentType", x),
                                     FirstName = GetValue<string>("Name", x),
                                     LastName = GetValue<string>("LastName", x),
                                     Email = GetValue<string>("Email", x),
                                     PhoenNumber = GetValue<string>("MobilePhoneNumber",x)

                                 }).ToList();

                    sqlDataReader.Close();
                }

                catch (SqlException ex)
                {
                    if (sqlDataReader != null) sqlDataReader.Close();

                    cmd.Dispose();

                    throw ex;
                }

                finally
                {
                    if (sqlDataReader != null) sqlDataReader.Dispose();

                    cmd.Dispose();
                }

            }


        }

        return customers;
    }

我个人喜欢使用classLibraries进行SQL调用。这可能超出了您的问题,但个人偏好。

就实体框架而言,我的经验缺乏,但我认为实体框架+存储过程是一个坏主意。

希望这能提供一些清晰度