构建更好的数据访问层

时间:2011-04-02 01:57:00

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

为了访问我的数据库并使用我的存储过程,我创建了这个非常简单的数据访问层(如果有人可以称之为“层”)。我有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。

1 个答案:

答案 0 :(得分:3)

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

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

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知道如何连接到您的数据库

您应该能够找到有关实体框架的大量信息,但我发现学习的最简单方法是跳入并开始尝试做某事,然后在问题出现时找到问题的答案。我不会立即尝试使用它来做一些非常关键或时间敏感的事情,因为肯定会有一个学习曲线,一旦你遇到一些陷阱,你就会学会更好的方法。

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