diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj
new file mode 100644
index 0000000000..69e9c3802f
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AbpPerfTest.WithAbp.csproj
@@ -0,0 +1,17 @@
+
+
+
+ net5.0
+
+
+
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs
new file mode 100644
index 0000000000..1cd88989e6
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/AppModule.cs
@@ -0,0 +1,55 @@
+using AbpPerfTest.WithAbp.EntityFramework;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Volo.Abp;
+using Volo.Abp.AspNetCore.Mvc;
+using Volo.Abp.Autofac;
+using Volo.Abp.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore.SqlServer;
+using Volo.Abp.Modularity;
+using Volo.Abp.Uow;
+
+namespace AbpPerfTest.WithAbp
+{
+ [DependsOn(
+ typeof(AbpAspNetCoreMvcModule),
+ typeof(AbpAutofacModule),
+ typeof(AbpEntityFrameworkCoreSqlServerModule)
+ )]
+ public class AppModule : AbpModule
+ {
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ context.Services.AddAbpDbContext(options =>
+ {
+ options.AddDefaultRepositories();
+ });
+
+ Configure(options =>
+ {
+ options.UseSqlServer();
+ });
+
+ Configure(options =>
+ {
+ options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled;
+ });
+ }
+
+ public override void OnApplicationInitialization(ApplicationInitializationContext context)
+ {
+ var app = context.GetApplicationBuilder();
+ var env = context.GetEnvironment();
+
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+
+ app.UseRouting();
+
+ app.UseConfiguredEndpoints();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs
new file mode 100644
index 0000000000..ed7bdb6a4d
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Controllers/BookController.cs
@@ -0,0 +1,86 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using AbpPerfTest.WithAbp.Dtos;
+using AbpPerfTest.WithAbp.Entities;
+using Microsoft.AspNetCore.Mvc;
+using Volo.Abp.Domain.Repositories;
+
+namespace AbpPerfTest.WithAbp.Controllers
+{
+ [Route("api/books")]
+ public class BookController : Controller
+ {
+ private readonly IRepository _bookRepository;
+
+ public BookController(IRepository bookRepository)
+ {
+ _bookRepository = bookRepository;
+ }
+
+ [HttpGet]
+ public async Task> GetListAsync()
+ {
+ var books = await _bookRepository.GetListAsync();
+
+ return books
+ .Select(b => new BookDto
+ {
+ Id = b.Id,
+ Name = b.Name,
+ Price = b.Price,
+ IsAvailable = b.IsAvailable
+ })
+ .ToList();
+ }
+
+ [HttpGet]
+ [Route("{id}")]
+ public async Task GetAsync(Guid id)
+ {
+ var book = await _bookRepository.GetAsync(id);
+
+ return new BookDto
+ {
+ Id = book.Id,
+ Name = book.Name,
+ Price = book.Price,
+ IsAvailable = book.IsAvailable
+ };
+ }
+
+ [HttpPost]
+ public async Task CreateAsync(CreateUpdateBookDto input)
+ {
+ var book = new Book
+ {
+ Name = input.Name,
+ Price = input.Price,
+ IsAvailable = input.IsAvailable
+ };
+
+ await _bookRepository.InsertAsync(book);
+
+ return book.Id;
+ }
+
+ [HttpPut]
+ [Route("{id}")]
+ public async Task UpdateAsync(Guid id, CreateUpdateBookDto input)
+ {
+ var book = await _bookRepository.GetAsync(id);
+
+ book.Name = input.Name;
+ book.Price = input.Price;
+ book.IsAvailable = input.IsAvailable;
+ }
+
+ [HttpDelete]
+ [Route("{id}")]
+ public async Task DeleteAsync(Guid id)
+ {
+ await _bookRepository.DeleteAsync(id);
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs
new file mode 100644
index 0000000000..158fc86b52
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/BookDto.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace AbpPerfTest.WithAbp.Dtos
+{
+ public class BookDto
+ {
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs
new file mode 100644
index 0000000000..fa3aa996f6
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Dtos/CreateUpdateBookDto.cs
@@ -0,0 +1,11 @@
+namespace AbpPerfTest.WithAbp.Dtos
+{
+ public class CreateUpdateBookDto
+ {
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs
new file mode 100644
index 0000000000..75a94d7271
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Entities/Book.cs
@@ -0,0 +1,19 @@
+using System;
+using Volo.Abp.Domain.Entities;
+
+namespace AbpPerfTest.WithAbp.Entities
+{
+ public class Book : BasicAggregateRoot
+ {
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+
+ public Book()
+ {
+ Id = Guid.NewGuid();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs
new file mode 100644
index 0000000000..02e5f788cf
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContext.cs
@@ -0,0 +1,28 @@
+using AbpPerfTest.WithAbp.Entities;
+using Microsoft.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace AbpPerfTest.WithAbp.EntityFramework
+{
+ public class BookDbContext : AbpDbContext
+ {
+ public DbSet Books { get; set; }
+
+ public BookDbContext(DbContextOptions builderOptions)
+ : base(builderOptions)
+ {
+
+ }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.Entity(b =>
+ {
+ b.ToTable("Books");
+ b.Property(x => x.Name).HasMaxLength(128);
+ });
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs
new file mode 100644
index 0000000000..b50975b8c2
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/EntityFramework/BookDbContextFactory.cs
@@ -0,0 +1,29 @@
+using System.IO;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Microsoft.Extensions.Configuration;
+
+namespace AbpPerfTest.WithAbp.EntityFramework
+{
+ public class BookDbContextFactory : IDesignTimeDbContextFactory
+ {
+ public BookDbContext CreateDbContext(string[] args)
+ {
+ var configuration = BuildConfiguration();
+
+ var builder = new DbContextOptionsBuilder()
+ .UseSqlServer(configuration.GetConnectionString("Default"));
+
+ return new BookDbContext(builder.Options);
+ }
+
+ private static IConfigurationRoot BuildConfiguration()
+ {
+ var builder = new ConfigurationBuilder()
+ .SetBasePath(Directory.GetCurrentDirectory())
+ .AddJsonFile("appsettings.json", optional: false);
+
+ return builder.Build();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs
new file mode 100644
index 0000000000..f8b3db4d21
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.Designer.cs
@@ -0,0 +1,48 @@
+//
+using System;
+using AbpPerfTest.WithAbp.EntityFramework;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace AbpPerfTest.WithAbp.Migrations
+{
+ [DbContext(typeof(BookDbContext))]
+ [Migration("20201222135738_Added_Books")]
+ partial class Added_Books
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityColumns()
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.1");
+
+ modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsAvailable")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("Price")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs
new file mode 100644
index 0000000000..f61374b9dc
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/20201222135738_Added_Books.cs
@@ -0,0 +1,31 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace AbpPerfTest.WithAbp.Migrations
+{
+ public partial class Added_Books : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Books",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true),
+ Price = table.Column(type: "real", nullable: false),
+ IsAvailable = table.Column(type: "bit", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Books", x => x.Id);
+ });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Books");
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs
new file mode 100644
index 0000000000..8987a178df
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Migrations/BookDbContextModelSnapshot.cs
@@ -0,0 +1,46 @@
+//
+using System;
+using AbpPerfTest.WithAbp.EntityFramework;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace AbpPerfTest.WithAbp.Migrations
+{
+ [DbContext(typeof(BookDbContext))]
+ partial class BookDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityColumns()
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer)
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.1");
+
+ modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsAvailable")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("Price")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Program.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Program.cs
new file mode 100644
index 0000000000..37b8418e62
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Program.cs
@@ -0,0 +1,21 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+
+namespace AbpPerfTest.WithAbp
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateHostBuilder(args).Build().Run();
+ }
+
+ public static IHostBuilder CreateHostBuilder(string[] args) =>
+ Host.CreateDefaultBuilder(args)
+ .ConfigureWebHostDefaults(webBuilder =>
+ {
+ webBuilder.UseStartup();
+ })
+ .UseAutofac();
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json
new file mode 100644
index 0000000000..a5d1af3797
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Properties/launchSettings.json
@@ -0,0 +1,28 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:50732",
+ "sslPort": 44312
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "AbpPerfTest.WithAbp": {
+ "commandName": "Project",
+ "dotnetRunMessages": "true",
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs b/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs
new file mode 100644
index 0000000000..55d22b7dca
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/Startup.cs
@@ -0,0 +1,18 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace AbpPerfTest.WithAbp
+{
+ public class Startup
+ {
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddApplication();
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ app.InitializeApplication();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json
new file mode 100644
index 0000000000..8983e0fc1c
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json
new file mode 100644
index 0000000000..9cd22c72c3
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithAbp/appsettings.json
@@ -0,0 +1,13 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*",
+ "ConnectionStrings": {
+ "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithAbp;Trusted_Connection=True;MultipleActiveResultSets=true"
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj
new file mode 100644
index 0000000000..fd061fe040
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/AbpPerfTest.WithoutAbp.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net5.0
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs
new file mode 100644
index 0000000000..c7b5746bc7
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Controllers/BookController.cs
@@ -0,0 +1,93 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using AbpPerfTest.WithoutAbp.Dtos;
+using AbpPerfTest.WithoutAbp.Entities;
+using AbpPerfTest.WithoutAbp.EntityFramework;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+
+namespace AbpPerfTest.WithoutAbp.Controllers
+{
+ [Route("api/books")]
+ public class BookController : Controller
+ {
+ private readonly BookDbContext _bookDbContext;
+
+ public BookController(BookDbContext bookDbContext)
+ {
+ _bookDbContext = bookDbContext;
+ }
+
+ [HttpGet]
+ public async Task> GetListAsync()
+ {
+ var books = await _bookDbContext.Books.ToListAsync();
+
+ return books
+ .Select(b => new BookDto
+ {
+ Id = b.Id,
+ Name = b.Name,
+ Price = b.Price,
+ IsAvailable = b.IsAvailable
+ })
+ .ToList();
+ }
+
+ [HttpGet]
+ [Route("{id}")]
+ public async Task GetAsync(Guid id)
+ {
+ var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id);
+
+ return new BookDto
+ {
+ Id = book.Id,
+ Name = book.Name,
+ Price = book.Price,
+ IsAvailable = book.IsAvailable
+ };
+ }
+
+ [HttpPost]
+ public async Task CreateAsync(CreateUpdateBookDto input)
+ {
+ var book = new Book
+ {
+ Name = input.Name,
+ Price = input.Price,
+ IsAvailable = input.IsAvailable
+ };
+
+ await _bookDbContext.Books.AddAsync(book);
+ await _bookDbContext.SaveChangesAsync();
+
+ return book.Id;
+ }
+
+ [HttpPut]
+ [Route("{id}")]
+ public async Task UpdateAsync(Guid id, CreateUpdateBookDto input)
+ {
+ var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id);
+
+ book.Name = input.Name;
+ book.Price = input.Price;
+ book.IsAvailable = input.IsAvailable;
+
+ await _bookDbContext.SaveChangesAsync();
+ }
+
+ [HttpDelete]
+ [Route("{id}")]
+ public async Task DeleteAsync(Guid id)
+ {
+ var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id);
+
+ _bookDbContext.Books.Remove(book);
+ await _bookDbContext.SaveChangesAsync();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs
new file mode 100644
index 0000000000..46ab9599dc
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/BookDto.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace AbpPerfTest.WithoutAbp.Dtos
+{
+ public class BookDto
+ {
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/CreateUpdateBookDto.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/CreateUpdateBookDto.cs
new file mode 100644
index 0000000000..f5af124a65
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Dtos/CreateUpdateBookDto.cs
@@ -0,0 +1,11 @@
+namespace AbpPerfTest.WithoutAbp.Dtos
+{
+ public class CreateUpdateBookDto
+ {
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs
new file mode 100644
index 0000000000..d33b5c309c
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Entities/Book.cs
@@ -0,0 +1,20 @@
+using System;
+
+namespace AbpPerfTest.WithoutAbp.Entities
+{
+ public class Book
+ {
+ public Guid Id { get; set; }
+
+ public string Name { get; set; }
+
+ public float Price { get; set; }
+
+ public bool IsAvailable { get; set; }
+
+ public Book()
+ {
+ Id = Guid.NewGuid();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContext.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContext.cs
new file mode 100644
index 0000000000..92c5dc1cc1
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContext.cs
@@ -0,0 +1,27 @@
+using AbpPerfTest.WithoutAbp.Entities;
+using Microsoft.EntityFrameworkCore;
+
+namespace AbpPerfTest.WithoutAbp.EntityFramework
+{
+ public class BookDbContext : DbContext
+ {
+ public DbSet Books { get; set; }
+
+ public BookDbContext(DbContextOptions builderOptions)
+ : base(builderOptions)
+ {
+
+ }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder)
+ {
+ base.OnModelCreating(modelBuilder);
+
+ modelBuilder.Entity(b =>
+ {
+ b.ToTable("Books");
+ b.Property(x => x.Name).HasMaxLength(128);
+ });
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContextFactory.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContextFactory.cs
new file mode 100644
index 0000000000..d92948fcbc
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/EntityFramework/BookDbContextFactory.cs
@@ -0,0 +1,29 @@
+using System.IO;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
+using Microsoft.Extensions.Configuration;
+
+namespace AbpPerfTest.WithoutAbp.EntityFramework
+{
+ public class BookDbContextFactory : IDesignTimeDbContextFactory
+ {
+ public BookDbContext CreateDbContext(string[] args)
+ {
+ var configuration = BuildConfiguration();
+
+ var builder = new DbContextOptionsBuilder()
+ .UseSqlServer(configuration.GetConnectionString("Default"));
+
+ return new BookDbContext(builder.Options);
+ }
+
+ private static IConfigurationRoot BuildConfiguration()
+ {
+ var builder = new ConfigurationBuilder()
+ .SetBasePath(Directory.GetCurrentDirectory())
+ .AddJsonFile("appsettings.json", optional: false);
+
+ return builder.Build();
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs
new file mode 100644
index 0000000000..0fc7fef909
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.Designer.cs
@@ -0,0 +1,47 @@
+//
+using System;
+using AbpPerfTest.WithoutAbp.EntityFramework;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace AbpPerfTest.WithoutAbp.Migrations
+{
+ [DbContext(typeof(BookDbContext))]
+ [Migration("20201222132615_Added_Books")]
+ partial class Added_Books
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityColumns()
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.1");
+
+ modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsAvailable")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("Price")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.cs
new file mode 100644
index 0000000000..cb5103c93c
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/20201222132615_Added_Books.cs
@@ -0,0 +1,31 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace AbpPerfTest.WithoutAbp.Migrations
+{
+ public partial class Added_Books : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Books",
+ columns: table => new
+ {
+ Id = table.Column(type: "uniqueidentifier", nullable: false),
+ Name = table.Column(type: "nvarchar(128)", maxLength: 128, nullable: true),
+ Price = table.Column(type: "real", nullable: false),
+ IsAvailable = table.Column(type: "bit", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Books", x => x.Id);
+ });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Books");
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs
new file mode 100644
index 0000000000..9d494bb518
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Migrations/BookDbContextModelSnapshot.cs
@@ -0,0 +1,45 @@
+//
+using System;
+using AbpPerfTest.WithoutAbp.EntityFramework;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+namespace AbpPerfTest.WithoutAbp.Migrations
+{
+ [DbContext(typeof(BookDbContext))]
+ partial class BookDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .UseIdentityColumns()
+ .HasAnnotation("Relational:MaxIdentifierLength", 128)
+ .HasAnnotation("ProductVersion", "5.0.1");
+
+ modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uniqueidentifier");
+
+ b.Property("IsAvailable")
+ .HasColumnType("bit");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("nvarchar(128)");
+
+ b.Property("Price")
+ .HasColumnType("real");
+
+ b.HasKey("Id");
+
+ b.ToTable("Books");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Program.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Program.cs
new file mode 100644
index 0000000000..b657f16862
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Program.cs
@@ -0,0 +1,17 @@
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Hosting;
+
+namespace AbpPerfTest.WithoutAbp
+{
+ public class Program
+ {
+ public static void Main(string[] args)
+ {
+ CreateHostBuilder(args).Build().Run();
+ }
+
+ public static IHostBuilder CreateHostBuilder(string[] args) =>
+ Host.CreateDefaultBuilder(args)
+ .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); });
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json
new file mode 100644
index 0000000000..74f1d25f0e
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Properties/launchSettings.json
@@ -0,0 +1,28 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:16268",
+ "sslPort": 44323
+ }
+ },
+ "profiles": {
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "AbpPerfTest.WithoutAbp": {
+ "commandName": "Project",
+ "dotnetRunMessages": "true",
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5003;http://localhost:5002",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs
new file mode 100644
index 0000000000..cf2a61df14
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/Startup.cs
@@ -0,0 +1,45 @@
+using AbpPerfTest.WithoutAbp.EntityFramework;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+namespace AbpPerfTest.WithoutAbp
+{
+ public class Startup
+ {
+ private readonly IConfiguration _configuration;
+
+ public Startup(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddMvc();
+
+ services.AddDbContext(options =>
+ {
+ options.UseSqlServer(_configuration.GetConnectionString("Default"));
+ });
+ }
+
+ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
+ {
+ if (env.IsDevelopment())
+ {
+ app.UseDeveloperExceptionPage();
+ }
+
+ app.UseRouting();
+
+ app.UseEndpoints(endpoints =>
+ {
+ endpoints.MapControllers();
+ });
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json
new file mode 100644
index 0000000000..8983e0fc1c
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json
new file mode 100644
index 0000000000..7f6ca466b2
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.WithoutAbp/appsettings.json
@@ -0,0 +1,13 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*",
+ "ConnectionStrings": {
+ "Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithoutAbp;Trusted_Connection=True;MultipleActiveResultSets=true"
+ }
+}
diff --git a/test/AbpPerfTest/AbpPerfTest.sln b/test/AbpPerfTest/AbpPerfTest.sln
new file mode 100644
index 0000000000..b8baba19de
--- /dev/null
+++ b/test/AbpPerfTest/AbpPerfTest.sln
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithoutAbp", "AbpPerfTest.WithoutAbp\AbpPerfTest.WithoutAbp.csproj", "{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithAbp", "AbpPerfTest.WithAbp\AbpPerfTest.WithAbp.csproj", "{13021286-B5D8-4A3E-8F36-5256D32638A7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal