在ASP.net?

时间:2015-12-27 11:57:48

标签: c# asp.net data-access-layer n-tier-architecture

我有一个示例ASP.net应用程序,我想使用n层架构创建它,所以我有一个数据库,其中包含表和存储过程(对这些表执行(CRUD)操作) ,现在当我尝试创建数据访问层时,我创建了使用ado.net来调用这些存储过程的方法,我创建了它,但是这些方法返回像这样的数据表:

public DataTable getallcourcesdetailsbyid(string courseid) {
    SqlParameter[] parameter = new SqlParameter[] { new SqlParameter("@courseid", courseid) };

    return sqlhelper.ExecuteParamerizedSelectCommand("usp_getcoursedetailsbyid", CommandType.StoredProcedure, parameter);
}

所以我发现有更好的方法来创建具有表示数据库中的表的属性的类,以保存数据访问层返回的数据 喜欢这个:

 class course{
    public int courseid { get; set; }
    public string coursename { get; set; }
    public short specializationid { get; set; }
    public short subjectid { get; set; }
    public short instructorid { get; set; }
    public string startdate { get; set; }
    public string enddate { get; set; }
    public bool isactive { get; set; }
    public bool isdeleted { get; set; }
}

但是这些存储过程并不总是返回特定表中的数据,例如上面的类课程目前在数据库中的课程表,但上面的方法称为“getallcourcesdetailsbyid”调用存储过程,代码如下

select courseid,coursename,startdate,enddate,courseimgpath,specialization,firstname,lastname,subjectname,price,coursedetails,teacherimgpath 
from joacademytest.course  
inner join joacademytest.specialization ON joacademytest.course.specializationid = joacademytest.specialization.specializationid 
inner join joacademytest.[subject]  on joacademytest.course.subjectnameid=joacademytest.[subject].subjectid
inner join joacademytest.teachers on joacademytest.course.instructerid=joacademytest.teachers.teacherid
inner join dbo.courcesprices on joacademytest.course.priceid=dbo.courcesprices.priceid
 where joacademytest.course.isactive=1 and joacademytest.course.isdeleted=0 and courseid = @courseid;

因此存储过程不会返回课程对象中存在的相同列,但它表示来自4个连接表的列,因此我是否必须根据表中存在的列或基于返回的列创建实体类通过我的存储过程。我在互联网上搜索过,从来没有发现任何提到我可以根据存储过程返回列创建实体类的实体让我感到困惑。

2 个答案:

答案 0 :(得分:0)

创建映射到存储过程结果的类没有任何问题。事实上许多ORM都像实体框架一样,nHibernate允许你这样做。最终这取决于你想要实现的目标,性能,维护等等,这些都是非常广泛的主题。为了回答你的问题并牢记你当前的设置,我建议 -

  • 创建映射到存储过程的实体,如果,存储过程是从数据库获取数据的首选方式,事实上你没有重新发明轮子你可以使用许多Orm工具之一 - dapperEF
  • 或者,您可以返回动态对象,而不是从数据表中创建实体。

希望这会有所帮助

答案 1 :(得分:0)

我一直在做的是创建一个代表我的数据库中的表的类。在您描述的场景中,您有一个返回数据的存储过程,我将其移动到视图中。然后我创建一个表示该视图的类。如果你不能这样做,你必须将它保存在存储过程中,那么我只是创建一个围绕存储过程返回的类。