实现简单ORM框架的最有效方法是什么?

时间:2015-09-15 00:23:51

标签: c# database orm model

我们有一个简单的数据库,但可以包含数千行。我们正在尝试在其上构建一个简单,轻量级的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;
}

......或者我这样做错了吗?

1 个答案:

答案 0 :(得分:2)

一个选项是使用CSLA framework。它不是ORM,它是一个“智能对象”框架。它具有对实体和后代实体集合的简单,有效的更改跟踪。它还有几个可选功能,例如:

  1. 通过配置文件将应用程序配置为2层或3层应用程序的能力。
  2. 基于角色的安全性。
  3. 形式化验证规则(包括对验证属性的支持)。
  4. 正式化业务规则(用于在实体之间同步数据)。
  5. 配置数据层的几个选项,支持任何数据持久性机制。
  6. 支持.NET中几乎任何UI框架。
  7. 几个对象原型,包括只读或读写实体和集合。
  8. 缺点是学习框架有很多学习曲线(虽然有很好的文档),并且它不是DI或测试框架友好。