我想创建一个DMS系统的引擎,我想知道如何创建业务逻辑层。
我将讨论以下选项:
使用Entity Framework并稍后为引擎的客户端提供它作为业务。
问题是缺少对属性和验证的控制,因为它是生成的代码。
手动创建我自己的业务层类,而不使用Entity Framework或任何ORM:
问题是一项艰巨的任务,比如彻底改造。
在Entitiy Framework上创建我自己的业务层类(使用它)
问题似乎是通过创建具有相同名称的新类重复代码,并且每个属性都将覆盖由ORM生成的相反的属性。
我是否以正确的方式讨论了这个问题?
答案 0 :(得分:4)
简而言之,在以下情况下应避免使用ORM:
您的程序将执行批量插入/更新/删除(例如插入选择,以及以非唯一的方式为条件的更新/删除)。 ORM并非旨在有效地进行这些批量操作;你最终会一次删除一条记录。
您使用的是高度自定义的数据类型或转化。 ORM通常不善于处理BLOB,并且如何告诉他们如何“映射”对象是有限制的。
在与SQL Server的通信中,您需要绝对最高的性能。 ORM可能会遇到N + 1问题和其他查询效率低下的问题,总体而言,它们会在您的对象请求和SQL语句之间添加一层(通常是反射性的)转换,这会降低您的速度。
ORM应该在大多数基于应用程序的记录维护的情况下使用,其中用户正在查看聚合结果和/或更新单个记录,包括一次一个简单数据类型。 ORM比原始SQL具有使用Linq提供程序提供编译器检查查询的能力的极大优势;几乎所有流行的ORM(Linq2SQL,EF,NHibernate,Azure)都有一个Linq查询界面,它可以捕获很多“胖手指”和查询中的其他常见错误,当你使用“魔术字符串”形成时SQLCommands。 ORM通常还提供数据库独立性。经典的NHibernate HBM映射是XML文件,可以根据需要进行交换,以指向MSS,Oracle,SQLite,Postgres和其他RDBMS上的存储库。即使是“流畅的”映射(代码文件中的类),如果设计正确,也可以换出。 EF具有类似的功能。
答案 1 :(得分:1)
所以你问如何做“X”而不做“X”? ORM是一种抽象,与任何其他抽象一样,它有缺点,但不是你提到的那些。
答案 2 :(得分:1)
免责声明:我在Mindscape工作,为.NET构建LightSpeed ORM
由于您没有询问具体问题,而是关于使用ORM解决灵活性问题的方法,我认为从供应商的角度来看我会讨论一些观点。它可能对您有用,也可能没用,但可能会提供一些思考的食物: - )
在设计O / R Mapper时,重要的是要考虑我们所说的“逃生舱”。 ORM将不可避免地推出一组默认行为,这是开发人员获得生产力增益的一种方式。
我们使用LightSpeed学到的一个经验教训就是开发人员需要这些逃生舱。例如,KeithS在此声明ORM不适合批量操作 - 在大多数情况下这是正确的。我们在这个场景中提出了一些客户,并为我们的Remove()操作添加了一个重载,允许您传入一个删除所有匹配记录的查询。这节省了必须将实体加载到内存并删除它们。倾听开发人员痛苦的地方并帮助快速解决这些问题对于帮助构建可靠的解决方案非常重要。
所有ORM都应该有效地批量查询。话虽如此,我们惊讶地发现许多ORM没有。这很奇怪,因为通常可以相当容易地进行批处理,并且可以捆绑多个查询并立即发送到数据库以节省往返次数。这是我们从第1天开始为任何支持它的数据库所做的事情。这只是在这个帖子中进行批处理的一小部分。这些批处理查询的质量是真正的挑战,坦率地说,某些ORM会生成一些可怕的SQL语句。
总的来说,您应该选择一个能够立即提高工作效率的ORM(几乎是演示程序的样式'参见我在30年代查询的数据!'),但也注意到更大规模的解决方案,这是逃避舱口的地方演示,但需要非常有用的功能。
我希望这篇文章没有出现太多的销售情况,但我想提请注意考虑选择它时任何产品背后的思维过程。如果哲学与你需要工作的方式相匹配,那么你可能会比选择那种没有的方式更快乐。
如果您有兴趣,可以了解我们的LightSpeed ORM for .NET。
答案 3 :(得分:-1)
根据我的经验,当您的应用程序执行以下数据操作时,应避免使用ORM:
1)批量删除:大多数ORM工具都不会真正删除数据,它们会用垃圾收集ID(GC记录)标记它以保持数据库的一致性。最糟糕的是,ORM会在将其标记为已删除之前收集您要删除的所有数据。这意味着如果要删除1000000行,ORM将首先获取数据,将其加载到应用程序中,将其标记为GC,然后更新数据库;我认为这是一个巨大的资源。
2)批量插入和数据导入:大多数ORM工具将在业务类上创建业务层验证,如果要验证1条记录但是如果要插入/导入数百甚至数百万条记录过程可能需要数天。
3)报告生成:ORM工具可以创建简单的列表报告或简单的表连接,就像在order-order_details场景中一样。但在大多数情况下,ORM只会减慢数据的检索速度,并会添加报告所需的更多联接。转换为数据库引擎提供的工作比通常使用SQL方法的工作要多