所以说真的,你们都看到了一致的做法?
它们的存在都是有原因的,当另一个不存在时,它们都有用。您将始终与 SQL 领域中的表紧密耦合。如果您想通过列索引或字符串耦合它,这只是您的选择。
实际上,我从未设计过使用数据表的系统。我有一个强类型面向对象的语言,所以我选择在通用数据容器上使用对象。
有ORM 框架,如Entity Framework (microsoft)、Dapper、NHibernate 等,允许您的数据库行(XML 节点、Json 对象等)表示一个 .net 对象(已定义、匿名,有时还包括元组) .目标是从存储系统系统中获取数据并将您的请求转换为类。检索数据后;
数据表可能如下所示:
[1]Id [2]FirstName [3]LastName
(int) (string) (string)
--------------------------------------------
1 Erik Philips
所以计算一个全名变成如下代码:
var fullName = $"{dt.Rows[i][2].ToString()} {dt.Rows[i][3].ToString()}";
或
var fullName = $"{dt.Rows[i]["FirstName"].ToString()} {dt.Rows[i]["LastName"].ToString()}";
它的作用是什么,但是应该封装面向对象语言中的逻辑。使用 ORM,您的数据是通过表示数据访问的类请求的,并被配置为获取数据并映射它(我不会详细介绍细节)。首先,您首先创建一个POCO:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
然后您通过数据访问类请求它们;
实体框架(DbContext)
var person = DbContext.Persons.FirstOrDefault(p => p.id == 1);
// OR
var person = DbContext.Set<Person>().FirstOrDefault(p => p.id == 1);
Dapper:(*我没有使用过 Dapper,所以这在技术上可能是错误的,但你明白了)
var person = connection.Query<Person>("Select * FROM CUSTOMERS WHERE Id = 1").FirstOrDefault()
NHibernate:
var person = session.Get<Person>(Id);
在所有这些实例中,您都会返回一个 Person 类/对象。现在我们可以封装业务逻辑(我们需要有一种一致的方式来向我们的数据消费者表示“全名”)。
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BornOn { get; set; }
public boolean IsMarried { get; set; }
public string FullName
{
get
{
return $"{FirstName} {LastName}";
}
}
}
但这就是这一切的主要目标吗?
在我个人看来,这一切的目的是帮助开发人员编写好的代码,其中包括(与我将评论的问题相关的项目);
使用S.O.L.I.D. Principles:
单一单一责任原则
// What else could this class possibly be used for?
public class Person ....
Writing readable code with as little documentation as possible.
var tom = dbContext.Persons.FirstOrDefault(p => p.FirstName == "Tom");
if (tom.IsMarried) ...
if (tom.BornOn > DateTime.Now) ...