1

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

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

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

选项 3:别的东西,但我对 LINQ 和拖放的东西很警惕,他们以前烧过我。

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

4

5 回答 5

3

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

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

按照这种方法,您可以扩展该模式以满足您的需求。您可以从数据库中检索记录作为对象,更改其值,然后更新记录(选项 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
        }
    }
}
于 2012-04-18T01:37:14.250 回答
2

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

于 2012-04-18T00:31:08.103 回答
0

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

于 2012-04-18T01:31:47.903 回答
0

Nhibernate 也是一个非常可靠的久经考验的真正 ORM,有一个大型社区支持它。

于 2012-04-18T02:03:11.017 回答
0

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

于 2014-08-14T15:10:53.640 回答