ORM - 特定于用于 .NET 的 SQL Server 2008+

Posted

技术标签:

【中文标题】ORM - 特定于用于 .NET 的 SQL Server 2008+【英文标题】:ORM - specific to SQL Server 2008+ for .NET 【发布时间】:2011-02-11 07:19:47 【问题描述】:

是否有一个 ORM绑定到 MS SQL 2008+,生成 .NET 代码,利用 MS SQL 的特定功能?

我对 2 个功能特别感兴趣:

(1) 通过键获取一组记录,不会映射到“select in”查询。 - 这可以通过在 2005+ 中使用 OPENXML 或在 2008+ 中使用 Table-Valued Parameters 来实现

(2) 通过对数据库的单个请求插入多个记录(这与 Bulk-Insert 相似但不同)。例如:

Customer[] customers = CreateSomeCostomers();  
dataManager.Save(customers);

所以在客户端准备好SQL相关代码,然后全部发送到SQL服务器。

顺便说一句,存储过程是不可能的。

如果您 ***ers 对我有任何建议,我会很高兴。

谢谢!

更新:

我正在寻找一个完整解决方案,而不是我可以根据自己的需要定制的可扩展框架/产品。所以自定义NHibernate/linq2sql/etc。通过编写我自己的代码实现不适合我的需要。


关于接受的答案的几句话。

似乎目前所有的 ORM 框架都试图涵盖多个数据库/技术。所以我想没有现成的解决方案可以满足我的需求,至少没有开箱即用的解决方案。

我了解@Ryk,指向 Fluent NHibrenate,认为这种解决方案确实存在,这是配置问题。我查看了 NHibernate 和 Fluent NHibernate 的源代码,但没有发现任何支持我正在寻找的功能的东西。例如,我在两个源代码中都找不到关键字OPENXMLsp_xml_preparedocument。所以也许我错过了一些东西,但我不这么认为。由于赏金是有时间限制的,我无法对 FN 或 NH 进行更深入的调查。我仍然认为那里不支持这些功能。

因此,根据我的最佳理解,公认的答案是,没有这样的事情。声称这一点的最通用的答案是@Cade Roux 的答案。

感谢大家的参与。 干杯!

【问题讨论】:

如果 NHibernate 不支持这些功能,扩展它以支持这些功能可能不会有太大的难度。 @Michael Maddox - Ayende 在这里谈到了 NHibernate 的 TVP 问题:ayende.com/Blog/archive/2008/08/26/… 【参考方案1】:

很遗憾,没有。微软决定使用 Entity Framework 走多平台路线。虽然如果他们围绕 SQL Server 构建一些东西并将其他数据库留给各自的数据库供应商或第三方 OR 映射器,那就太好了。

【讨论】:

所以 MS 没有提供这样的框架/库,但我正在寻找 any 解决方案,可能是从 OSS 到某些公司产品的任何东西。【参考方案2】:

如果您想使用 SQL Server 功能,那么黑盒 ORM 将无法满足此要求。

如果您想充分利用您选择的数据库(任何数据库),您的耦合将更加紧密,因此您最好使用代码生成(生成存储过程和)您的映射层一个插入式 ORM。

【讨论】:

我没查,但我想我可以创建一个(临时)表类型,具有唯一的名称,与TVP一起使用,然后删除表类型。所有这些都在同一个请求中,并且不涉及存储过程。对我来说似乎很合理。我将尝试创建一个 PoC 项目并更新问题。 @Ron Klein,你说得对,你可以在一个批处理中创建 TYPE 和 DROP TYPE,而不用将它们作为批处理中的第一个语句,甚至可以与参数化语句结合使用。【参考方案3】:

是的,我相信Fluent NHibernate 会做你想做的事。需要一点设置,不太难,但一旦开始工作,它就是一种享受。

在性能方面,它非常好,但如果您打算使用它创建一个每分钟执行数千次的事务系统,我可能会采用旧的存储过程方式进行调优。

基本思想是创建实体类和映射器类,将数据库对象映射到 c# 对象。从那里您只需填充对象或对象列表,然后执行 Object.Update() 或 Object.Delete() 或 Object.Get() 等。已经内置,您不必去连接它。如果需要,您可以随时覆盖它。它非常灵活。

【讨论】:

根据您的建议,我查看了这个项目。看起来这个项目主要是为了减轻 NHibernate 模式映射的痛苦。如果是这样,这会将问题简化为:“NHibernate 是否支持上述功能?” (1) 通过键获取一组记录,不会映射到“select in”查询。 - 如果我理解正确, - 是的 - 这可以通过在 2005+ 中使用 OPENXML 或在 2008+ 中使用表值参数来实现 (2) 通过对数据库的单个请求插入多个记录(这类似于to,但与 Bulk-Insert 不同)。 - 是的 @Ryk,所以基本上你的意思是 NHibernate 支持上述功能。 NHibernate 是否支持这些开箱即用的功能? @Ron:与所有这些东西一样,是的,它是开箱即用的,但必须连接盒子。这就是 Fluent NHibernate,而不仅仅是 nhibernate。 @Ryk,如果您能提供此类实施的链接,我将不胜感激。【参考方案4】:

除了编写自己的数据访问层之外,Nhibernate 是您唯一的选择,您可以轻松扩展 Nhibernate 以使用新的|自定义|特定的 SQL 语法。

【讨论】:

【参考方案5】:

我意识到这个答案来得太晚了(尽管可能对其他人有所帮助)。由于此处给出的原因以及在此过程中获得适当的数据库源代码管理,我们有自己的映射器,它可作为开源项目使用:bsn ModuleStore

这个工具集并没有像 nHibernate 或实体框架这样的 ORM 那样走,它确实需要更多的编码。但是,对于所有数据访问,它都遵循使用 SP 的“古老”方法(请不要争论 - 动态和静态 DB 代码各有利弊)。结果是查询必须在 SQL 中手动编码,让您可以完全控制在 DB 服务器上执行的代码。

至于一些好处,您可以获得实体的完整双向映射(是的,使用 TVP,使用高效的自定义数据读取器“流式传输”实体,而不是像大多数使用 TVP 的示例那样构建内存中的 DataTable)。它还支持返回多个结果集的 SP,最后但并非最不重要的是,它为数据库模块化、版本控制(在源代码级别与 SCM 正确集成)和完整性检查(比较数据库中存在的对象)提供了完全集成和相当可扩展的支持对源文件)。

【讨论】:

以上是关于ORM - 特定于用于 .NET 的 SQL Server 2008+的主要内容,如果未能解决你的问题,请参考以下文章

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器

Flask入门之触发器,事件,数据迁移

尝试运行特定于平台的构建时 Automake 失败

在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器

包括特定于 ASP.NET MVC4 视图或部分视图的脚本