三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

界面组件DevExpress Reporting——增强的SQL和实体框架数据源引入

DevExpress Reporting是.NET Framework下功能完善的报表平台,它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。

本文总结了v23.1中针对DevExpress报表和BI Dashboard产品中使用的SQL和实体框架数据源引入的一系列增强。

DevExpress新旧版本帮助文档下载可进QQ qun获取:169725316

从ASP.NET Core依赖注入容器中解析实体框架核心上下文

使用实体框架的ASP.NET Core应用程序将数据作为DbContext 对象提供给报表/仪表板。

此对象在HTTP请求的范围内工作,该请求的生存期与报表/仪表板的生存期不同。在HTTP请求上下文中创建一个报告,并启动一个后台线程来获取数据和创建文档。由于在初始HTTP请求完成后报表需要数据,并且仪表板在控件中使用已兑现的数据源,因此不能使用Entity Framework创建的默认DbContext实例(在HTTP请求的范围内)。

现在为开发人员提供了一种方法,可以从绑定到实体框架数据源的仪表板/报表的ASP.NET Core依赖注入容器中解析适当的实体框架核心上下文。

下面的新API用于创建自定义服务,从依赖注入容器中返回上下文对象:

  • IEFContextProvider
  • IEFContextProviderFactory

下面的代码片段实现了一个自定义服务,允许获得适当的EF Core上下文:

using DevExpress.Data.Entity; using DevExpress.DataAccess.Web; using System; using Microsoft.Extensions.DependencyInjection; namespace WebEFCoreApp.Services { public class CustomEFContextProviderFactory : IEFContextProviderFactory { private readonly IServiceProvider serviceProvider; public CustomEFContextProviderFactory(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; } public IEFContextProvider Create() { return new CustomEFContextProvider(serviceProvider.CreateScope()); } } public class CustomEFContextProvider : IEFContextProvider, IDisposable { private readonly IServiceScope scope; public CustomEFContextProvider(IServiceScope scope) { this.scope = scope; } public object GetContext(string connectionName, Type contextType) { // Returns the context for the specified `EFDataSource.ConnectionName`. if (connectionName == "efCoreConnection") return scope.ServiceProvider.GetRequiredService(contextType); return null; } public void Dispose() { scope.Dispose(); } }

在依赖注入容器中注册上下文和factory实现:

namespace DXWebApplication1 { public class Startup { public Startup(IConfiguration configuration, IWebHostEnvironment hostingEnvironment) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { // ... services.ConfigureReportingServices(configurator => { configurator.ConfigureWebDocumentViewer(viewerConfigurator => { // ... viewerConfigurator.RegisterEFContextProviderFactory(); }); configurator.UseAsyncEngine(); }); services.AddDbContext(options => options.UseSqlite("Data Source=file:Data/nwind.db"), ServiceLifetime.Transient); } } }
配置SqlDataSource服务查询
拦截SQL操作和命令

v23.1附带了新的IDBCommandInterceptor和IDBConnectionInterceptor接口。

这些接口允许您在建立到数据库的连接时拦截、修改和/或抑制SQL操作和命令,该列表包括低级数据库操作,例如在会话上下文中执行命令或设置键值对。一旦连接打开,您就可以在会话上下文中存储值并执行所需的请求。

设置隔离级别

设置还添加了ConnectionOptions.IsolationLevel 和 SqlQuery.IsolationLevel属性,来帮助指定用于将一个事务与另一个事务隔离的隔离级别。

您可以将IsolationLevel设置为以下值当中的一个:

  • None
  • ReadUncommitted
  • ReadCommitted
  • RepeatableRead
  • Serializable
  • Snapshot

每次执行查询时,将打开相应的事务类型(None除外)。一旦请求被执行,事务就会立即关闭。

这一策略的好处如下:

  • 过属性网格对话框在UI中设置隔离级别,您不需要创建存储过程来设置事务级别或编写任何代码。

  • 执行查询时不使用SQL数据库锁定,这可以显著减少查询时间。
← 返回列表