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

标签 c# asp.net data-access-layer

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

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

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

选项 3:其他,但我对 LINQ 和拖放操作持谨慎态度,它们以前曾让我感到头疼。

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

最佳答案

您可能想继续阅读 active record patterns以及其中的一些示例,然后实现您自己的类。

这是一个简单类的粗略草图,其中包含一些基本概念(如下)。

按照这种方法,您可以扩展模式以满足您的需求。您可能会从数据库中以对象的形式检索记录,更改其值,然后更新记录(选项 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
        }
    }
}

关于c# - 数据访问层中的静态与实例写入方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10201036/

相关文章:

python - Web2Py DAL - 如何检查列表 :string type items for None

java - 使用接口(interface)编写 DAO 类

c# - 如何在 VS2008 和 SQL Server CE 上基于现有的 .sdf 文件创建空的本地数据库

c# - 空格和 oledb

javascript - 如何在javascript中使用json将选择列表绑定(bind)到值

c# - 找不到类型或命名空间名称 'Class1'(是否缺少 using 指令或程序集引用?)

javascript - 简单的 Javascript If 语句在 ASP.NET MVC View 中不起作用

java - firestorm dao 替换的建议

c# - LINQ .Any VS .Exists - 有什么区别?

c# - 枚举和属性命名冲突