C# ORM体系结构

C# ORM体系结构,c#,asp.net,.net,mysql,orm,C#,Asp.net,.net,Mysql,Orm,背景:我有一个规模不大的项目(2个ASP.NET web应用程序,每个应用程序大约有10页)。这两个web应用程序共享许多后端需求,特别是操作一组大约50个表的能力。它们都使用相同的关系型数据库管理系统(RDBMS),这将始终是MySQL 问题:不久前,一个功能丰富的大型ORM库(亚音速)被添加到了项目中,结果发现它太多了。它太大了,零件太多了,开销太大了。一些由亚音速生成的集合的创建时间大于1分钟,而原始内联查询(我知道这很糟糕)的创建时间也大于2分钟。问题不只是亚音速,NHibernate和

背景:我有一个规模不大的项目(2个ASP.NET web应用程序,每个应用程序大约有10页)。这两个web应用程序共享许多后端需求,特别是操作一组大约50个表的能力。它们都使用相同的关系型数据库管理系统(RDBMS),这将始终是MySQL

问题:不久前,一个功能丰富的大型ORM库(亚音速)被添加到了项目中,结果发现它太多了。它太大了,零件太多了,开销太大了。一些由亚音速生成的集合的创建时间大于1分钟,而原始内联查询(我知道这很糟糕)的创建时间也大于2分钟。问题不只是亚音速,NHibernate和其他ORM工具太大了,有太多永远不会使用的特性。这些项目的范围也永远不会太大。另外,数据库不可知论是不必要的,因为我们永远不会离开MySQL,除了内部,没有人会使用这个工具

显然,内联查询是不好的、不安全的、错误的。Linq也不是一个选项。因此,我需要一些小型的定制ORM工具来打包到库中。我的想法包括:

  • 基础是一个表类,其构造函数只填充一个DB名称和一个表名
  • Table类将公开一些方法
  • public DataRow Record(string primaryKeyValue)//获取单个记录
  • public DataRowCollection Records(string whereclausearrangeofkeyvalues)//获取记录的集合
  • public bool Save()//通过更新/插入任何已更改的行来保存数据库的当前状态;不确定维护哪些记录不干净的最佳方法
  • public bool Loaded(string primaryKeyValue)//告知给定记录是否存在
  • 公共数据行集合查询(字符串mysqlQuery)//运行特定的自定义查询
  • 私下里,几乎只有几样东西:一种消毒剂,一种做选择的方法,一种做提升的方法,而没有其他的东西
也许StackOverflow的知识集合可以突出这个基本设置的缺点或提供改进。提前谢谢


编辑:一个限制条件(不确定它在这一点上有多牢固)是我没有使用预构建的库。更高的ups被亚音速关闭,任何第三方公用设施都可能被拒绝。因此,它更多地是一种架构选择,而不是实用工具选择。

除非生成真正的自定义查询,否则您确实不想使用
DataRow
。而且绝对不能“清理”查询:而是使用参数


试试看。一般来说,它只需返回db.SetCommand(“SELECT*FROM Person”).ExecuteList()即可

在您开始制作自己的工具之前,您应该检查Micro ORM,例如:


其他的也很少。

为什么不试试像Dapper.Net(Stackoverflow orm btw)这样的微orm呢。Micro-orms非常轻,性能也很好。尽管您必须确保它能与mysql一起工作

您的设置的问题在于它根本无法解决当前的问题。顺便说一句,这是大多数ORM的问题之一

例如:

假设您有一个Projects表,您需要获取状态为Active的项目列表。您不需要/想要所有字段,只需要项目名称、状态、开始日期和上次更新日期

如何在布局中实现这一点?一开始,您的table类将无法工作(只需要连接和表名),因为它将要求您提取所有列:这是您已经面临的问题

这意味着你必须使用你的查询方法来得到你想要的。。但是,
table
如何知道在调用
.Save()
时只更改单行的状态列?现在您变得非常复杂,因为它需要另一个自定义查询才能执行。或者,至少,您必须在每个列上实现更改跟踪,并且让您的引擎足够智能,只更新那些已更改的值

现在考虑你的大多数查询都是这样的。也就是说,您想要拉取通常涉及跨越表边界的连接的记录,您不想要所有的列(出于性能原因),并且您的更新将非常有针对性。。。这就是基于模式到类的直接映射的ORMs总是无法通过性能测试的地方


那么,你打算怎么办?我的意见是,您必须将正在进行的数据访问类型分为两组逻辑操作。其中一组将涉及常规OOP类,以执行验证并确保业务规则正常运行。这些将在创建全新记录时使用

对于下一个集合,您可以使用简单的数据表或动态类。将查询发送到数据库并提取所需的记录。无论何时进行更新,都要确保查询具有高度的针对性。您可以通过存储过程或内联sql来实现这一点;随便你喜欢哪个。实际上,它非常适合这个用例,或者只需将企业库与常规的SqlCommand/SqlConnections结合使用


关键是,除非您了解现有ORM的问题,否则不要构建自己的“ORM”

你可能想看看煤油,或者

煤油是一种动态的、自适应的、配置不太容易使用的ORM,用C#编写

  • 在“基本”模式下,它表示与给定数据库的动态链接,这意味着您可以完全自由地对其编写任何查询或命令,并在易于使用的动态记录中检索结果
  • 在“映射”模式下,它提供了一个专门为wor设计的实体框架