数据访问层中的静态写入方法与实例写入方法

本文关键字:方法 实例 静态 访问 数据 | 更新日期: 2023-09-27 18:31:23

我正在用 C# 为 SQL Server 数据库表创建一个数据访问层。 数据访问层包含表中每一列的属性,以及从数据库中读取和写入数据的方法。 让读取方法基于实例似乎是有意义的。 我的问题是关于处理数据库生成的主键属性getter/setter和write方法。 据我所知,我有三个选择...

选项 1:使用静态方法,同时只允许主键上的 getter 将允许我强制将所有正确的值写入数据库,但作为开发人员来说很笨拙。

选项 2:使用基于实例的写入方法将更易于维护,但我不确定如何处理主键上的 get/set,并且我可能必须在写入数据库之前实现对实例的某种验证。

选项 3:其他东西,但我对 LINQ 和拖放内容持谨慎态度,它们以前烧过我。

这里有标准做法吗? 也许我只需要一个指向可靠教程的链接?

数据访问层中的静态写入方法与实例写入方法

您可能希望阅读活动记录模式及其一些示例,然后实现自己的类/类。

下面是一个包含一些基本概念的简单类的粗略草图(如下所示)。

按照此方法,您可以扩展模式以满足您的需求。您可能可以作为对象从数据库中检索记录,更改其值,然后更新记录(选项 2)。或者,如果开销太大,请使用直接更新数据库中记录的静态方法(选项 1)。对于插入操作,如果需要,数据库(SP/查询)应验证表上的自然/唯一键,并可能返回指示唯一约束错误的特定值/代码)。对于更新,如果允许更新自然键字段,则需要执行相同的检查。

这在很大程度上取决于您的应用程序将允许特定表的功能。

与静态方法相比,我倾向于从数据库中检索对象,然后更改值并保存。对我来说,通过调用代码更容易使用,并且可以更轻松地处理类内部的晦涩业务逻辑。

public class MyEntityClass
{
    private int _isNew;
    private int _isDirty;
    private int _pkValue;
    private string _colValue;
    public MyEntityClass()
    {
        _isNew = true;
    }
    public int PKValue
    {
        get {return _pkValue;}
    }
    public string ColValue
    {
        get {return _colValue;}
        set
        {
            if (value != _colValue)
            {
                _colValue = value;
                _isDirty = true;
            }
        }
    }
    public void Load(int pkValue)
    {
        _pkValue = pkValue;
        //TODO: query database and set member vars based on results (_colVal)
        // if data found
        _isNew = false;
        _isDirty = false;
    }
    public void Save()
    {
        if (_isNew)
        {
            //TODO: insert record into DB
            //TODO: return DB generated PK ID value from SP/query, and set to _pkValue
        }
        else if (_isDirty)
        {
            //TODO: update record in DB
        }
    }
}

你有没有看过实体框架。我知道你说过你对 LINQ 持谨慎态度,但 EF4 处理了你提到的很多事情,并且是 DAL 的一个相当标准的做法。

我会坚持使用ORM工具(EF,Telerik的OpenAccess等),除非你需要一个你需要(不想要)完全控制的自定义dal。 对于附带项目,我使用 ORM - 在工作中,但我们有自己的自定义 DAL,其中包含提供程序抽象以及对象和数据库之间的自定义映射。

Nhibernate也是一个非常可靠的尝试和真正的ORM,有一个庞大的社区支持它。

实体框架是初始 DAL 的方法,然后在您需要的地方进行优化: 我们公司实际上在比较 EF 和 SQL 读取器时做了一些基准测试,发现对于查询数据库以获取一两个表的信息,速度约为 6(两者都不明显快于另一个)。 在两个表之后,性能受到影响,但并不是特别重要。 编写自己的 SQL 语句变得有价值的一个地方是批处理提交操作。 此时,EF 允许你直接编写 SQL 查询。 因此,请为自己节省一些时间,并使用 EF 进行基本的繁重工作,然后使用其直接连接进行更复杂的操作。 (这是两全其美的)