当前位置: 首页 > 编程语言 > C#

使用存储过程时哪种ORM最好分享

时间:2023-04-10 13:00:16 C#

使用存储过程时哪种ORM最好.我尝试了codesmith和nhibernate,但遇到了麻烦。我不介意我的ORM是免费的还是付费的。SubSonic对存储过程有很好的支持。它将每个包装在一个辅助方法中,使您可以在需要时从结果中检索强类型的集合或实体。我在这篇博文中展示了一种方法。只要您的存储过程返回与SELECT*FROMTableName相同的模式,它就应该与您的SubSonic实体一起使用。至于基于db生成类,SubSonic生成的是部分类,所以你可以根据需要扩展它们。您还可以将SubSonic生成的类映射到您的实际模型。Subsonic有一个灵活的解决方案:classCustomerOrder{privatestringproductName;publicstringProductName{get{returnproductName;}设置{产品名称=值;}}私人整数总计;publicintTotal{get{返回总计;}设置{总计=值;然后:Listorders=Northwind.SPs.CustOrderHist("ALFKI").ExecuteTypedList();CustOrderHist是一个可靠的“瑞士军刀”ORM。免责声明:我是Dapper的作者。如果你正在寻找一个简单的对象映射器来处理业务对象的映射过程,那么Dapper非常适合。请记住,它没有“图管理”、“身份图”等。它提供了一个完整的解决方案,涵盖了许多其他ORM没有的场景。尽管如此,它还是提供了最快的对象物化器之一,在某些基准测试中比EF快10倍,甚至比Sonic快100倍。琐碎的:创建procspGetOrder@Idintasselect*fromOrderswhereId=@Idselect*fromOrderItemswhereOrderId=@Idcanbemappedusing:vargrid=cnn.QueryMultiple("spGetOrder",new{Id=1},命令类型:CommandType.StoredProcedure);varorder=grid.Read();order.Items=grid.Read();此外,您还支持:允许您将单行添加到多个对象输入/输出/返回参数的多映射器支持用于数据库特定参数处理的可扩展接口(如TVP)例如:createprocspGetOrderFancy@Idint,@Messagenvarchar(100)outputasset@Message=N'Mymessage'select*fromOrdersjoinUsersuonOwnerId=u.IdwhereId=@Idselect*fromOrderItemswhereOrderId=@Idreturn@@rowcount可以映射:varp=newDynamicParameters();p.Add("Id",1);p.Add("Message",direction:ParameterDirection.Output);p.Add("rval",direction:ParameterDirection.ReturnValue);vargrid=cnn.QueryMultiple("spGetOrder",p,commandType:CommandType.StoredProcedure);varorder=grid.Read((o,u)=>{o.Owner=u;returno;});order.Items=grid.Read();varreturnVal=p.Get("rval");varmessage=p.Get("消息");最后,dapper还允许自定义参数实现:publicinterfaceIDynamicParameters{voidAddParameters(IDbCommandcommand);实现此接口时,您可以告诉dapper您希望添加到命令中的参数这允许您支持Table-Valued-Params和其他DB特定功能。根据数据库实体框架,NHibernate可能是您的最佳选择(链接中的示例)。LINQtoSQL设计器将为您提供类型安全的存储过程作为DataContext对象的方法。您可以非常轻松地将这些映射到对象以进行CRUD操作。事实上,我正在做这件事。现在你有一个DBA编写存储过程,我认为你最好的选择是与他密切合作,弄清楚如何将表映射到对象,以及如何构建你的数据库以与你的域模型一起工作。sprocs没有任何问题,它们只是需要开发人员和DBA之间的密切合作。理想情况下,有问题的DBA是您项目团队的一部分……我喜欢EntityFramework现在处理存储过程的方式。您可以将sproc与实体上的crud操作相关联,甚至可以检测哪些sproc与实体的属性相匹配。现在一个很大的缺点是,如果你将一个存储过程与一个实体相关联,你必须将所有的crud操作与一个存储过程相关联。这篇EFSproc文章有一些关于如何在EF中使用sprocs的很好的例子,它也有一些非常好的扩展方法。我看到的主要问题是,通过使用SP,您会自动失去使用ORM获得的很多灵活性,尤其是在检索信息时。因此,我相信您将无法使用大多数ORM的所有功能。例如,如果你使用linq2sql,你将有许多SP的包装器。您还可以将生成的实体的插入、删除和更新映射到存储过程。你松懈的地方在于信息的检索,因为查询现在是固定的(并且你可能检索到比需要更多的信息,即额外的列-或者创建大量的SP)和延迟加载。更新:我更像是一个linq2sql的人,但我会再看看你对NHibernate所做的假设。特别是,我怀疑它会强制执行列顺序,因为它会配置列名称(请参阅http://nhibernate.info/blog/2008/11/23/populating-entities-from-stored-procedures-with-nhibernate.html)。它还支持我不知道该怎么做的linq2sql:http://nhibernate.info/blog/2008/11/23/populating-entities-with-associations-from-stored-procedures-with-nhibernate.html。注意,我不是说linq2sql不支持最后一种,只是不知道怎么支持;)以上就是C#学习教程的全部内容:使用存储过程时,哪种ORM最好,如果对大家有用,需要详细了解C#学习教程,希望大家多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: