我们有一个简单的数据库,但可以包含数千行。我们正在尝试在其上构建一个简单,轻量级的ORM层。想想Dapper。但是,我们正在努力弄清楚如何确保每个ID只有一个对象。
考虑以下数据:
ID Last First
===== ========== =======
19 Donnely Rick
20 Donovan Sarah
21 Edwards Sandra
现在考虑以下用于在ORM层中创建Person对象的SQL。
Select * From People Where ID = 20;
Select * From People Where LastName Like 'Don*'
在第一种情况下,你会回到'Donovan',但在第二种情况下,你会收回'Donovan'和'Donnely'。由于Donovan已被退回,我们希望该实例回来。
现在你需要通过ID进行一些查找。这很简单。什么不是查询数据库,返回行,然后确定在创建对象时,您需要创建新对象或更新现有对象(如果数据发生更改。)
我唯一能想到的是让查找有一个方法GetObjectById,它返回一个现有对象,或创建一个新对象,存储它,然后返回它。我认为它也必须基于弱引用,所以它们不会一直在内存中“挂起”。
// Assume the implementation stores the references weakly
public Person GetPersonById(int id)
{
Person person = this[id]; // assume this returns null if not found
if(person == null)
{
person = new Person(id);
this[id] = person;
}
return person;
}
......或者我这样做错了吗?
答案 0 :(得分:2)
一个选项是使用CSLA framework。它不是ORM,它是一个“智能对象”框架。它具有对实体和后代实体集合的简单,有效的更改跟踪。它还有几个可选功能,例如:
缺点是学习框架有很多学习曲线(虽然有很好的文档),并且它不是DI或测试框架友好。