我有一个企业应用程序,它严重依赖于业务逻辑的存储过程。我正在考虑将Webforms的前端重做到ASP.NET MVC,但我希望我不必为每个存储过程编写模型(有数百个)。通常,“Get”存储过程与等效的“set”存储过程没有相同的参数,并且通常单个存储过程正在更新多个数据库表。
所以我的问题是在这种后端构建ASP.NET MVC应用程序的最佳实践是什么?实体框架会为此工作吗?我肯定希望我不需要为每个存储过程构建100个模型,一个或两个......
我也正在考虑使用普通的剃刀网页和webdata的动态数据行模型,它可能更适合。但是我不能像Kendo UI那样使用整洁的东西(我想)。
提前感谢您的智慧。
答案 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调用。这可能超出了您的问题,但个人偏好。
就实体框架而言,我的经验缺乏,但我认为实体框架+存储过程是一个坏主意。
希望这能提供一些清晰度