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

时间:2012-04-18 00:17:48

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

您可能希望阅读active record patterns及其中的一些示例,然后实现您自己的类/类。

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

按照这种方法,您可以扩展模式以满足您的需求。您可以将数据库中的记录作为对象检索,更改其值,然后更新记录(Option2)。或者,如果这是太多的开销,使用直接更新数据库中的记录的静态方法(Option1)。对于插入,数据库(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
        }
    }
}

答案 1 :(得分:2)

您是否看过Entity Framework。我知道你说你对LINQ很谨慎,但是EF4会处理你提到的很多事情,对于DAL来说是一个相当标准的做法。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

实体框架是您最初的DAL的方法,然后在您需要的地方进行优化:我们公司实际上在比较EF与SQL阅读器时进行了一些基准测试,并发现在数据库中查询一个或两个表值的信息,速度大约是6's(两者都没有明显快)。在两个表之后,性能受到了打击,但它并不是非常重要。编写自己的SQL语句变得有价值的一个地方是批处理提交操作。此时,EF允许您直接编写SQL查询。因此,请节省一些时间并使用EF进行基本的重物提升,然后使用其直接连接进行更复杂的操作。 (这是两全其美的)