这是问题的简化(有许多方法),但在需要与数据库交谈的应用程序中,我通常会看到以下两种模式之一:
对象关系映射(ORM),其中(通常)数据库中的每个表都有一个对应的"行包装器"类,其公共属性与表中的列相匹配.有时这些类还会自动检索相关信息,以便外键列可以显示为相关数据(而不仅仅是PK值).
DataTables(和/或DataSets),其中数据作为DataTable从服务器检索并以该形式(甚至在UI中)使用.
这两种方法之间的主要区别之一是ORM允许您在代码中引用强类型字段,如下所示:
Person bob = new Person(); bob.FirstName = "Bob"; collectionPeople.Add(bob);
而使用DataTable方法,您的代码将是这样的:
DataRow newrow = datatablePeople.NewRow(); newrow["FirstName"] = "Bob"; datatablePeople.Rows.Add(newrow);
在这种情况下,ORM方法受益于编译时检查,而DataTable方法则没有.另一方面,DataTable(和DataSet)是已经编写的数据结构,可以很好地直接表示关系数据,因此使用它们的代码通常可以更快地实现.此外,使用DataTables的代码可以被其他人轻松理解和修改; 自行开发(通常是COTS)ORM系统通常会在"引擎盖下"进行额外的数据库访问,以填充外键等等,这可能会给不知情的人带来问题.
那么你普遍喜欢哪种方法?为什么?
在使用数据时,Datatable在概念上肯定会更直接.而且它在ORM中找不到有时不自然的习语.(在更新之前将记录查询到本地内存;连接是指针;键值本身是指针,因此,添加记录需要加载父记录)
ORM的巨大优势是......
1)它为你编写sql,所以你真的不必编写任何sql来做基本的crud.当然,编写更复杂的语句必须在功能较弱的子语言(即hql)中完成
2)ORM的另一大优势是,当您获得结果时,它会将其映射到值对象,而无需编写一堆代码来映射值并处理类型转换.
如果你有强大的sql技能但想要优势2覆盖,我会选择ibatis
我喜欢DataTables的方式,因为我老了,累了,对像Subsonic和Linq这样的时尚持怀疑态度.
除此之外,当您使用ORM时,通常会最大限度地减少在SQL中执行的操作.您没有在SQL中添加大量逻辑,也没有批处理多个SQL语句,以便在一次数据库中执行多项操作.因此,您倾向于更频繁地访问数据库,这是一个很大的性能影响.
使用数据集,我可以做类似的事情:
从table1中
选择col1,col2 ...选择col1,col2 ...从table2中
选择col1,col2 ... from table3
然后使用Tables [0],Tables [1],Tables [2]进行数据库的一次访问以获取所有三个DataSet,以引用它们.它在性能上有很大的不同.
有一天,与数据库的交互可能会如此之快,以至于没有必要对SQL进行批处理,但那一天还没有到来.当它到来时,我将切换到ORM,但在那之前,我愿意让我的代码变得更加丑陋以换取性能.用户使用缓慢的应用程序并不好玩.
最后,我喜欢SQL.我擅长SQL.真棒.我不想花时间弄清楚如何让Linq发出我想要的SQL.这会减慢我的表现.