【问题标题】:build a better data access layer构建更好的数据访问层
【发布时间】:2011-07-28 02:17:48
【问题描述】:

为了访问我的数据库并使用我的存储过程,我制作了这个非常简单的数据访问层(如果有人可以称之为“层”)。我有 8 个文件,每个文件看起来像:

using System;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;

public class TasksDBHandler
{
    private static Database db = DatabaseFactory.CreateDatabase("DBNAME");

    public static void SetTaskDepreciationData(long taskId, long fieldId, string value)
    {
        DbCommand command = db.GetStoredProcCommand("dbo.P_CUS_TSK_SetTaskDepreciationData");
        db.AddInParameter(command, "@task_id", DbType.Int64, taskId);
        db.AddInParameter(command, "@field_id", DbType.Int64, field);
        db.AddInParameter(command, "@value", DbType.String, value);
        db.ExecuteNonQuery(command);
    }

    //Many more stored procedures calls
}

我想构建一个新的更好的数据访问层,但我不知道它应该是什么样子。我希望能够使用存储过程而不需要为每个存储过程编写静态方法,我想要更好的连接管理等等/

有人知道怎么做吗?

我正在使用 .Net 和 SQL SERVER。

【问题讨论】:

  • 一定要遵循答案中的建议并使用 ORM。

标签: c# .net sql sql-server linq


【解决方案1】:

您看过任何 ORM 产品吗?有 Linq2Sql、实体框架、NHibernate 等。除非您需要做的是非常基础的工作,否则学习使用现有框架可能会比尝试编写自己的框架获得更好的结果。

在像实体框架这样的 ORM 中,您通常不会手动管理您的连接,它会从您的数据库中定义一个对象(或实体)模型和一个“上下文”,它负责从您的数据库中检索数据并进行映射到实体模型中类的正确属性。因此,您从上下文请求某些内容,它将满足您的请求所需的数据加载到内存中,您像其他类一样使用它,然后告诉上下文将您的更改保存回数据库。在实体框架中有几种方法可以与您的实体模型进行交互,但我将使用的示例是 Linq2Entities。您编写了一个 Linq 查询,上下文负责将其转换为对数据库的查询 *免责声明:我没有尝试运行此代码,它只是作为示例 p>

using(MyEntitiesContext context = new MyEntitiesContext())
{
    var idleUsers = from u in context.User
                    where u.LoggedIn && u.LastActivity > DateTime.Now.AddMinutes(-30)
                    select u;

    foreach(User u in idleUsers)
    {
        u.Status = UserStatus.Idle;
    }

    context.SaveChanges();
}

显然幕后发生了很多事情:

  • 从您的数据库生成整个对象模型(您可以选择要包含在模型中的表,并且可以在同一个项目中创建多个模型)。
  • 有上下文,它管理数据库连接并将您的 Linq 表达式转换为数据库查询
  • 必须在您的 .config 文件中定义连接字符串,以便 Entity Framework 知道如何连接到您的数据库

您应该能够找到有关 Entity Framework 的大量信息,但我发现学习的最简单方法是开始尝试做某事,然后在问题出现时找到答案。我不会尝试在高度关键或时间敏感的事情上立即使用它,因为肯定有一个学习曲线,一旦你经历了一些陷阱,你就会学会更好的使用它的方法。

这是一个link to Microsoft's Entity Framework 4 Quickstart,它应该会给你一些相当简单的尝试。玩得开心!

【讨论】:

  • 我希望我将所有 1000 个存储过程轻松转换为 linq 到实体。现在我有很多存储过程,我必须找到一种方法来编写更好的数据访问层。
  • 如果有一种方法可以使用其他较新框架的 linq2entities 并支持存储过程,以便我可以在有时间的时候轻松进行转换 - 这将是最好的。我会应用任何起点。
  • @Naor - 我确信你可以在 EF 中获取或创建存储过程(要么从数据库中获取它们,要么生成它们以便稍后发布)。
  • 在实体框架中,您应该能够从数据库创建实体模型,然后将存储过程作为方法附加到实体之外。它过去只允许您将存储过程附加为插入、更新或选择,但较新的版本更灵活。 免责声明:我实际上还没有在实体框架中使用过该功能......
  • 我真的会欣赏一个应该是 dal 的例子。我不知道如何处理连接以及如何开始.. 我搜索了很多,但我无法专注于某些事情..
猜你喜欢
  • 2019-07-31
  • 2010-09-13
  • 2012-02-09
  • 2011-04-18
  • 2017-06-17
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
相关资源
最近更新 更多