数据访问层中的静态写入方法与实例写入方法
本文关键字:方法 实例 静态 访问 数据 | 更新日期: 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 进行基本的繁重工作,然后使用其直接连接进行更复杂的操作。 (这是两全其美的)