Questions tagged «orm»

对象关系映射(ORM)是一种用于在面向对象的系统和关系数据库之间进行映射的技术。


4
具有大型系统的实体框架-如何划分模型?
我正在使用具有1000多个表,另外几百个视图和几千个存储过程的SQL Server数据库。我们希望开始在新项目中使用Entity Framework,并且正在制定策略。我最想知道的是如何最好地将表拆分为不同的模型(如果我们先编写代码,则为EDMX或DbContext)。我可以马上想到一些策略: 按模式拆分 我们将表拆分成大概十二种模式。我们可以为每个架构创建一个模型。但是,这并不是完美的,因为dbo最终仍然非常大,具有500多个表/视图。另一个问题是,某些工作单元最终将不得不进行跨越多个模型的事务,这增加了复杂性,尽管我认为EF使这一过程变得相当简单。 按意图 拆分模型不必担心架构,而是按意图拆分模型。因此,对于每个应用程序,项目,模块,屏幕,我们将具有不同的模型,具体取决于我们希望获得的粒度。我看到的问题是,在某些情况下不可避免地要使用某些表,例如User或AuditHistory。我们是将它们添加到每个模型中(违反我认为的DRY),还是将它们添加到每个项目使用的单独模型中? 完全不要分裂-一个巨大的模型 从开发的角度来看,这显然很简单,但是从我的研究和我的直觉来看,这似乎可以在设计时,编译时和运行时都表现出色。 在如此大的数据库上使用EF的最佳实践是什么?具体来说,人们在针对大量数据库对象设计模型时会使用哪些策略?是否有我没有想到的选项比上面的选项更好? 另外,这在诸如NHibernate的其他ORM中是否存在问题?如果是这样,他们是否提出了比EF更好的解决方案?



5
我应该检查数据库中是否存在某些东西并且快速失败或等待数据库异常
有两节课: public class Parent { public int Id { get; set; } public int ChildId { get; set; } } public class Child { ... } 分配给时ChildId,Parent我应该首先检查数据库中是否存在它,或者等待数据库引发异常? 例如(使用实体框架核心): 注意,即使在官方的Microsoft文档中,这类检查也已遍及整个Internet:https://docs.microsoft.com/zh-cn/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- MVC /处理与实体框架在ASP.NET MVC应用程序中的并发处理#修改部门控制器,但还有其他异常处理SaveChanges 另外,请注意,此检查的主要目的是向API用户返回友好消息和已知的HTTP状态,而不是完全忽略数据库异常。并且唯一引发异常的地方是在内部SaveChanges或SaveChangesAsync调用中...因此,当您调用FindAsync或时不会有任何异常Any。因此,如果子项存在但在此之前被删除,SaveChangesAsync则将引发并发异常。 我这样做的原因是,foreign key violation异常将很难格式化以显示“找不到ID为{parent.ChildId}的孩子”。 public async Task<ActionResult<Parent>> CreateParent(Parent parent) { // is this code redundant? // NOTE: its …

7
如何建议使用ORM代替存储过程?
我在一家仅使用存储过程进行所有数据访问的公司工作,这使我们的本地数据库保持同步非常烦人,因为每次提交都必须运行新的proc。过去,我曾经使用过一些基本的ORM,但是我发现使用它的经验要好得多,更干净。我想向开发经理和团队中的其他成员建议我们考虑使用某种ORM进行未来开发(团队中的其他成员仅熟悉存储过程,而从未使用过其他东西)。当前的体系结构是.NET 3.5,类似于.NET 1.1,具有“神类”,它们使用ActiveRecord的奇怪实现并返回在代码隐藏文件中循环的未类型化数据集-这些类的工作方式如下: class Foo { public bool LoadFoo() { bool blnResult = false; if (this.FooID == 0) { throw new Exception("FooID must be set before calling this method."); } DataSet ds = // ... call to Sproc if (ds.Tables[0].Rows.Count > 0) { foo.FooName = ds.Tables[0].Rows[0]["FooName"].ToString(); // other properties set …

6
使用EntityFramework反对什么参数?[关闭]
我当前正在构建的应用程序一直在使用存储过程和手工制作的类模型来表示数据库对象。有人建议使用Entity Framework,由于我对项目的了解并不多,因此我正在考虑切换到该框架。我的问题是,我觉得为EF争论的人只是在告诉我事情的好处,而不是坏的事情:) 我主要关心的是: 我们希望使用DataAnnotations进行客户端验证,这听起来好像我还是必须创建客户端模型,所以我不确定EF是否会节省那么多编码时间 我们希望通过网络时使类尽可能的小,并且我读到使用EF通常会包含不需要的额外数据 我们有一个跨多个数据库的复杂数据库层,我不确定EF是否可以处理此问题。我们有一个Common数据库,其中包含诸如Users,StatusCodes,Types等内容,以及针对应用程序不同实例的主数据库的多个实例。SELECT查询可以并且将在数据库的所有实例之间进行查询,但是用户只能修改当前正在使用的数据库中的对象。他们可以在不重新加载应用程序的情况下切换数据库。 对象模式非常复杂,通常涉及很多联接 EF的参数为: 并发。我不必在检查中编写代码以查看记录是否在每次保存之前都已更新 代码生成。EF可以为我生成部分类模型和POCO,但是我并不肯定这会为我节省很多时间,因为我认为我们仍然需要创建客户端模型进行验证和一些自定义解析方法。 由于我们不需要为每个数据库对象创建CRUD存储过程,因此可以加快开发速度 我们当前的体系结构由WPF服务和WPF桌面客户端组成,该WPF服务通过参数化的存储过程处理数据库调用,从WCF服务和WPF客户端传入/传出的POCO对象,以及将POCO转换为类模型以进行验证和验证的WPF桌面客户端本身。数据绑定。 所以我的问题是,EF是否适合这样做?我没有意识到关于EF的陷阱吗?

6
我应该选择教义2还是Propel 1.5 / 1.6,为什么?[关闭]
我想听听那些使用Doctrine 2(或更高版本)和Propel 1.5(或更高版本)的人的信。这两个对象关系映射器之间的大多数比较都基于旧版本-Doctrine 1与Propel 1.3 / 1.4,并且两个ORM在其最新修订版中都进行了重大的重新设计。例如,大多数对Propel的批评似乎都集中在“ ModelName Peer ”类上,无论如何在1.5中都弃用了该类。 到目前为止,这是我积累的(并且我尝试使此列表尽可能平衡...): 推进 优点 对IDE非常友好,因为它生成了实际的代码,而不是依赖于PHP魔术方法。这意味着诸如代码完成之类的IDE功能实际上很有帮助。 快速(就数据库使用而言-对数据库不进行运行时自省) 架构版本之间的干净迁移(至少在1.6 beta中) 可以生成PHP 5.3模型(即名称空间) 使用方法之类的东西很容易将很多东西链接到一个数据库查询中useXxx。(请参见上面的“代码完成”视频) 缺点 需要一个额外的构建步骤,即构建模型类。 每当更改Propel版本,更改设置或更改架构时,都需要重建生成的代码。这对某些人可能是不直观的,并且丢失了应用于模型的自定义方法。(我认为吗?) -不正确;自定义方法不会丢失,因为生成的类是基类。Propel提供了专门用于扩展的实体类。 一些有用的功能(即版本行为,架构迁移)处于beta状态。 教义 优点 更流行 与Propel的ActiveRecord策略相比,学说查询语言可以表达数据之间潜在的更复杂的关系。 与Propel相比,更易于添加可重用的行为。 用于构建架构的基于DocBlock的注释嵌入在实际的PHP中,而不是单独的XML文件中。 在各处使用PHP 5.3命名空间 缺点 需要学习一种全新的编程语言(Doctrine查询语言) 根据“魔术方法”在多个地方实现,使IDE自动完成功能一文不值。 需要数据库自省,因此默认情况下比Propel慢一些;缓存可以消除这种情况,但是缓存会增加相当大的复杂性。 较少的行为包含在核心代码库中。Propel开箱即用提供的某些功能(例如嵌套集)仅可通过扩展使用。 怪异的巨大:) 我仅通过阅读可用于这两种工具的文档来收集了这些信息-我实际上还没有构建任何东西。 我想听听那些曾经使用这两种工具的人,分享他们在每个库的优缺点方面的经验,以及他们对此的建议:)
30 php  orm  doctrine 


2
在Android开发中使用ORM是否有意义?
在Android开发中使用ORM是否有意义,还是针对UI和DB层之间更紧密的耦合而优化了框架? 背景:我刚刚开始进行Android开发,而我的第一个直觉(来自.net背景)是寻找一个小型的对象关系映射器以及其他有助于减少样板块的工具(例如POJOs + OrmLite + Lombok)。 但是,在开发第一个玩具应用程序时,我偶然发现了一个UI类,该类明确需要数据库游标:AlphabetIndexer。这让我怀疑Android库是否不适合UI和DB层的严格分离,如果我尝试在所有地方使用POJO(而不是直接访问数据库),我会错过许多有用的,省时的功能)。 澄清:我很清楚总体上使用ORM的优势,我特别感兴趣的是Android类库与之一起发挥的作用。

3
既然我们拥有Micro ORM,内联SQL是否仍被列为不良做法?
这是一个开放式的问题,但我想提出一些意见,因为我成长于一个以内联SQL脚本为标准的世界,然后我们都非常了解基于SQL注入的问题以及sql当时多么脆弱在各处进行字符串操作。 然后是ORM的曙光,您在其中向ORM解释查询并让它生成自己的SQL,在很多情况下,这种查询不是最佳方法,但又安全又容易。有关ORM或数据库抽象层的另一个好处是,SQL是在考虑数据库引擎的情况下生成的,因此我可以将Hibernate / Nhibernate与MSSQL,MYSQL一起使用,而我的代码从未更改,它只是一个配置细节。 现在快速发展到今天,Micro ORM似乎正在赢得更多开发人员的支持,我想知道为什么我们似乎在整个内联sql主题上都掉头了。 我必须承认,我确实喜欢没有ORM配置文件的想法,并且能够以更优化的方式编写查询,但是感觉就像我向诸如SQL注入之类的旧漏洞敞开了怀抱,而且我也将自己束缚于一个数据库引擎,因此,如果我希望我的软件支持多个数据库引擎,则需要做更多的字符串黑客攻击,这似乎开始使代码变得不可读且更脆弱。(就在有人提到它之前,我知道您可以在大多数micro orms中使用基于参数的参数,这在大多数情况下都可以防止sql注入) 那么人们对此事有何看法?在这种情况下,我将Dapper用作微型ORM,在这种情况下将NHibernate用作常规ORM,但是在每个领域中的大多数情况都非常相似。 我所说的内联SQL是源代码中的SQL字符串。曾经有过关于源代码中SQL字符串的设计争论,这有损于逻辑的基本意图,这就是为什么静态类型的linq样式查询如此流行的原因,它仍然仅是一种语言,但是在一页中说C#和Sql现在,您的原始源代码中混合了2种语言。为了澄清起见,SQL注入只是使用sql字符串的已知问题之一,我已经提到过可以通过基于参数的查询阻止这种情况的发生,但是我着重指出了在源代码中根植SQL查询的其他问题,例如缺少DB Vendor抽象以及在基于字符串的查询上丢失任何级别的编译时错误捕获功能,这些都是我们设法通过ORM的高级查询功能来解决的问题, 因此,我不太关注各个突出的问题,而更全局的是,由于大多数Micro ORM使用这种机制,现在再次将SQL字符串直接再次包含在源代码中变得越来越容易被接受。 这是一个类似的问题,它具有一些不同的观点,尽管更多是关于没有微规范上下文的内联sql: /programming/5303746/is-inline-sql-hard-coding
26 database  sql  orm 

2
DDD聚合序列化的最佳做法
根据DDD,域逻辑不应被序列化,对象关系映射等技术问题所污染。 那么,如何在不通过getter和setter公开公开状态的情况下序列化或映射聚合状态?我已经看到了很多示例,例如存储库实现,但是实际上所有示例都依赖于实体上的公共访问器和用于映射的值对象。 我们可以使用反射来避免公共访问器,但是IMO这些域对象仍将隐式依赖于序列化问题。例如,在不调整序列化/映射配置的情况下,您无法重命名或删除私有字段。因此,您必须考虑序列化,而应将重点放在域逻辑上。 那么,要遵循的最佳妥协是什么?与公共访问器一起生活,但要避免将它们用于映射代码以外的其他用途?还是我只是想念一些明显的东西? 我对序列化DDD域对象(由实体和值对象组成的聚合)的状态特别感兴趣。这与无状态服务在简单数据容器对象上运行的常规脚本或事务脚本场景中的序列化无关。

5
ORM是否启用富域模型的创建?
在我的大多数项目中使用Hibernate大约8年之后,我进入了一家不鼓励使用Hibernate并希望应用程序仅通过存储过程与DB进行交互的公司。 在执行了几周之后,我无法为我将开始构建的应用程序创建丰富的域模型,并且该应用程序看起来像(可怕的)事务脚本。 我发现的一些问题是: 由于存储过程仅加载最少的数据,因此无法导航对象图,这意味着有时我们具有具有不同字段的相似对象。一个示例是:我们有一个存储过程来从客户那里检索所有数据,另一个存储过程是从客户那里检索帐户信息以及一些字段。 许多逻辑最终出现在帮助器类中,因此代码变得更加结构化(实体用作旧的C结构)。 令人讨厌的脚手架代码,因为没有框架可以从存储过程中提取结果集并将其放入实体中。 我的问题是: 有没有人遇到过类似情况,并且不同意存储过程方法?你做了什么? 使用存储过程有实际好处吗?除了“没有人可以发布弃用表”这一愚蠢的观点之外。 有没有一种使用存储过程来创建富域的方法?我知道有可能使用AOP将DAO /存储库注入到实体中,从而能够导航对象图。我不喜欢这个选项,因为它非常接近伏都教。 结论 首先,谢谢大家的回答。我得出的结论是,ORM无法启用Rich Domain模型的创建(如某些人所述),但是它确实简化了(通常是重复的)工作量。以下是对结论的更详细说明,但并不基于任何硬数据。 大多数应用程序请求并将信息发送到其他系统。为此,我们在模型术语(例如,业务事件)中创建抽象,然后域模型发送或接收事件。事件通常需要来自模型的一小部分信息,而不是整个模型。例如,在一家网上商店中,支付网关会向用户收取一些用户信息和总计费用,但不需要购买历史记录,可用产品和所有客户群。因此,该事件具有少量特定的数据集。 如果我们将应用程序的数据库作为外部系统,则需要创建一个抽象,以允许我们将域模型实体映射到数据库(如NimChimpsky所述,使用数据映射器)。明显的区别是,现在我们需要为每个模型实体手工映射到数据库(旧模式或存储过程),而且还有一个痛苦,因为两个实体不同步,所以一个域实体可能会部分映射数据库实体(例如,仅包含用户名和密码的UserCredentials类映射到具有其他列的Users表),或者一个域模型实体可能映射到多个数据库实体(例如,如果存在一对一一张表上的映射,但我们只想将所有数据归为一类)。 在只有几个实体的应用程序中,如果不需要横向实体,那么额外的工作量可能很小,但是当有条件需要横向实体时,额外的工作量就会增加(因此,我们可能想实现某种“懒惰”正在加载”)。随着应用程序具有更多实体的发展,这项工作只会增加(我感觉它会非线性地增加)。我在这里的假设是,我们不会尝试重塑ORM。 将数据库视为外部系统的一个好处是,我们可以围绕以下情况编写代码:需要运行两种不同版本的应用程序,其中每个应用程序都有不同的映射。在连续交付生产的情况下,这变得更加有趣……但是我认为ORM在较小程度上也是可行的。 我将不考虑安全性,因为开发人员即使没有访问数据库的权限,也可以通过注入恶意代码来获取存储在系统中的大部分(即使不是全部)信息。我不敢相信我忘了删除记录客户信用卡详细信息的行,亲爱的上帝!)。 小更新(6/6/2012) 存储过程(至少在Oracle中)阻止执行诸如零停机时间连续交付之类的操作,因为对表结构的任何更改都将使过程和触发器无效。因此,在更新数据库期间,应用程序也将关闭。Oracle 为这种称为基于版本的重新定义提供了解决方案,但是我向该功能询问过的少数DBA提到,该功能实施得很差,他们不会将其放入生产数据库中。

3
“微型ORM”有哪些好处?
我一直在研究像Dapper这样的所谓的“微型ORM”,并且(由于它依赖于.NET 4.0,所以程度较轻),因为自我们当前的系统以来,这些方法在工作中可能比成熟的ORM更容易实现它高度依赖存储过程,因此需要大量重构才能与NHibernate或EF之类的ORM一起使用。与功能齐全的ORM相比,使用其中之一有什么好处?这似乎是围绕一个数据库连接只是薄薄的一层仍然强迫你写原始SQL -也许我错了,但我总是告诉了奥姆斯的原因首先是,所以你没有写SQL,它可以自动生成;特别是对于多表联接和表之间的映射关系,这在纯SQL中是很困难的,但是对于ORM来说却是微不足道的。 例如,看一个Dapper的例子: var connection = new SqlConnection(); // setup here... var person = connection.Query<Person>("select * from people where PersonId = @personId", new { PersonId = 42 }); 这与使用手动ADO.NET数据层有什么不同,除了您不必编写命令,设置参数并且我想使用Builder将实体映射回去外。看起来您甚至可以使用存储过程调用作为SQL字符串。 在使用Micro ORM有意义的地方,我还缺少其他明显的好处吗?我真的没有看到它如何通过使用ADO.NET的“旧”方式来节省任何东西,除了可能的几行代码外-您仍然必须写出找出需要执行哪些SQL(这可能会变得麻烦)以及您仍然必须映射表之间的关系(IMHO ORM最有帮助的部分)。
21 .net  orm 

4
何时使用存储库模式
我最近读到,将存储库模式与ORM结合使用不是一种好习惯。从我的理解来看,这是因为它们在SQL数据库上提供的抽象太泄漏而无法包含在模式中。 我对此有两个问题: 如果要转出ORM,该怎么办?如果您未在存储库中包含ORM特定代码,则您的应用程序中将包含该代码。 当不使用ORM且您正在使用ADO.NET进行数据访问并自己填充对象数据时,存储库模式仍然有效吗? 如果您使用ORM而不是存储库模式,那么将常用查询保留在哪里?将每个查询表示为一个类并具有某种查询工厂来创建实例是否明智?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.