我正在C#中为SQL Server数据库表创建数据访问层。数据访问层包含表中每列的属性,以及从数据库读取和写入数据的方法。将read方法基于实例似乎是有意义的。我的问题是关于处理数据库生成的主键属性getter / setter和write方法。据我所知,我有三种选择......
选项1:使用静态方法虽然只允许主键上的getter允许我强制将所有正确的值写入数据库,但作为开发人员是不实用的。
选项2:使用基于实例的写入方法将更易于维护,但我不确定如何处理主键上的get / set,我可能必须先实现某种实例验证写入数据库。
选项3:还有别的,但是我对LINQ和拖放东西很警惕,他们以前把我烧了。
这里有标准做法吗?也许我只需要一个固定教程的链接?
答案 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进行基本的重物提升,然后使用其直接连接进行更复杂的操作。 (这是两全其美的)