【问题标题】:What is the proper way to create entities in data access layer in ASP.net?在 ASP.net 的数据访问层中创建实体的正确方法是什么?
【发布时间】:2016-04-01 12:21:10
【问题描述】:

我有一个示例 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 个连接表的列,所以我必须根据表上存在的列或返回的列创建实体类通过我的存储过程。我在网上搜索过,从来没有发现任何人提到我可以根据存储过程返回的列创建实体类,这让我很困惑。

【问题讨论】:

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


    【解决方案1】:

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

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多