Browse Source

Merge branch 'dev' into issue-23300

pull/23309/head
Fahri Gedik 9 months ago
committed by GitHub
parent
commit
bf5ee9ce3c
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 53
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  2. 4
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  3. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg
  4. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15924-min.jpg
  5. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15933-min.jpg
  6. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15934-min.jpg
  7. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg
  8. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg
  9. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15946-min.jpg
  10. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg
  11. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg
  12. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg
  13. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15956-min.jpg
  14. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg
  15. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg
  16. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15964-min.jpg
  17. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15966-min.jpg
  18. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15968-min.jpg
  19. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15969-min.jpg
  20. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15970-min.jpg
  21. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15971-min.JPG
  22. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15972-min.JPG
  23. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15973-min.JPG
  24. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15974-min.JPG
  25. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15975-min.JPG
  26. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15976-min.JPG
  27. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15977-min.JPG
  28. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15979-min.JPG
  29. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15980-min.JPG
  30. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15981-min.JPG
  31. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15982-min.JPG
  32. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15983-min.JPG
  33. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15984-min.jpg
  34. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15985-min.JPG
  35. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15986-min.JPG
  36. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15987-min.JPG
  37. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15989-min.jpg
  38. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15994-min.jpg
  39. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg
  40. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg
  41. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg
  42. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg
  43. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16001-min.jpg
  44. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16002-min.jpg
  45. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16003-min.jpg
  46. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16006-min.JPG
  47. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16007-min.jpg
  48. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16008-min.jpg
  49. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16009-min.jpg
  50. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg
  51. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg
  52. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16013-min.jpg
  53. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16019-min.JPG
  54. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16021-min.JPG
  55. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16022-min.JPG
  56. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16023-min.JPG
  57. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16024-min.JPG
  58. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16025-min.JPG
  59. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16026-min.JPG
  60. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16027-min.JPG
  61. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16028-min.JPG
  62. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16029-min.JPG
  63. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16030-min.JPG
  64. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16031-min.JPG
  65. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16032-min.jpg
  66. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16040-min.JPG
  67. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16041-min.JPG
  68. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png
  69. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png
  70. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-1.JPG
  71. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-2.JPG
  72. BIN
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-3.JPG
  73. 101
      docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/post.md
  74. 2
      docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md
  75. 28
      docs/en/Community-Articles/2025-07-17-summar-campaign/post.md
  76. 6
      docs/en/docs-nav.json
  77. 17
      docs/en/framework/infrastructure/json.md
  78. 23
      docs/en/framework/ui/maui/index.md
  79. BIN
      docs/en/get-started/images/abp-studio-microservice-solution-runner-applications.png
  80. BIN
      docs/en/get-started/images/abp-studio-microservice-solution-runner.png
  81. BIN
      docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure-tiered.png
  82. BIN
      docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png
  83. 8
      docs/en/get-started/layered-web-application.md
  84. 4
      docs/en/get-started/microservice.md
  85. 10
      docs/en/solution-templates/microservice/index.md
  86. 10
      docs/en/solution-templates/microservice/main-components.md
  87. BIN
      docs/en/studio/images/monitoring-applications/monitoring-window-hint.png
  88. BIN
      docs/en/studio/images/monitoring-applications/monitoring.png
  89. BIN
      docs/en/studio/images/monitoring-applications/tools-create.png
  90. BIN
      docs/en/studio/images/monitoring-applications/tools-overview.png
  91. 19
      docs/en/studio/monitoring-applications.md
  92. 5
      docs/en/tutorials/book-store/part-05.md
  93. 1
      framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.Bundling/MauiStyleContributor.cs
  94. 3
      framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/toast/abp-toast.css
  95. 2
      framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj
  96. 6
      framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor.cs
  97. 24
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs
  98. 80
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs
  99. 92
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEfCoreNavigationHelper_Tests.cs
  100. 5
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs

53
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json

@ -723,6 +723,57 @@
"MakeAnnouncement": "Make Announcement",
"MakeAnnouncementInfo": "Check it if you want to make an announcement for this post",
"Permission:ViewCounts": "View counts",
"ReadCount": "Read Count"
"ReadCount": "Read Count",
"Menu:Solution": "Solution",
"Enum:LicenseType:1": "Personal",
"Enum:LicenseType:2": "Team",
"Enum:LicenseType:3": "Business",
"Enum:LicenseType:4": "Enterprise",
"Enum:Template:0": "Unknown",
"Enum:Template:1": "App No Layers",
"Enum:Template:2": "App Layered",
"Enum:Template:3": "Microservice",
"Enum:UiFramework:0": "Unknown",
"Enum:UiFramework:1": "None",
"Enum:UiFramework:2": "Mvc Razor Pages",
"Enum:UiFramework:3": "Angular",
"Enum:UiFramework:4": "Blazor Wasm",
"Enum:UiFramework:5": "Blazor Server",
"Enum:UiFramework:6": "Blazor Web App",
"Enum:UiFramework:7": "Blazor MaUI",
"Enum:DatabaseProvider:0": "Unknown",
"Enum:DatabaseProvider:1": "None",
"Enum:DatabaseProvider:2": "EfCore",
"Enum:DatabaseProvider:3": "MongoDb",
"Enum:Dbms:0": "Unknown",
"Enum:Dbms:1": "None",
"Enum:Dbms:2": "SqlServer",
"Enum:Dbms:3": "PostgreSql",
"Enum:Dbms:4": "Oracle",
"Enum:Dbms:5": "OracleDevart",
"Enum:Dbms:6": "MySql",
"Enum:Dbms:7": "Sqlite",
"Enum:UiTheme:0": "Unknown",
"Enum:UiTheme:1": "None",
"Enum:UiTheme:2": "Basic",
"Enum:UiTheme:3": "LeptonX",
"Enum:UiTheme:4": "LeptonX Lite",
"Enum:UiThemeStyle:0": "Unknown",
"Enum:UiThemeStyle:1": "System",
"Enum:UiThemeStyle:2": "Dim",
"Enum:UiThemeStyle:3": "Dark",
"Enum:UiThemeStyle:4": "Light",
"Enum:MobileApp:0": "Unknown",
"Enum:MobileApp:1": "None",
"Enum:MobileApp:2": "Maui",
"Enum:MobileApp:3": "ReactNative",
"Enum:CreationTool:0": "Unknown",
"Enum:CreationTool:1": "StudioUI",
"Enum:CreationTool:2": "StudioCli",
"Enum:CreationTool:3": "OldCli",
"Menu:TelemetryMenu": "Telemetry Reports",
"Menu:Studio": "Studio",
"Menu:Solutions": "Solutions",
"Menu:Users": "Users"
}
}

4
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json

@ -1892,6 +1892,8 @@
"SEOTitle": "SEO URL",
"InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again.",
"SelectAnOption": "Select an option",
"MostPopular": "Most Popular"
"MostPopular": "Most Popular",
"AnnouncmentsPageTitle": "ABP Community Announcements | Stay Updated with the Latest News",
"AnnouncmentsPageDescription": "Get the latest news, feature updates, release notes, and important announcements about the ABP framework and .NET ecosystem. Stay ahead with timely information directly from the ABP team."
}
}

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/1752664190317-min.jpeg

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15924-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15933-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15934-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15941-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15944-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15946-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15947-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15948-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 852 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15949-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 738 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15956-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15959-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15963-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15964-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15966-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 779 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15968-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 518 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15969-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15970-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15971-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15972-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15973-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15974-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15975-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15976-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15977-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 241 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15979-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15980-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15981-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15982-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15983-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15984-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15985-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15986-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15987-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15989-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15994-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15995-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15996-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15998-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_15999-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16001-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16002-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16003-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 984 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16006-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16007-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 994 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16008-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16009-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 788 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16011-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16012-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16013-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16019-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16021-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16022-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16023-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16024-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 472 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16025-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16026-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16027-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16028-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16029-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16030-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16031-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16032-min.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16040-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/IMG_16041-min.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 602 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/image-20250722203102576.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-1.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-2.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

BIN
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/my-talk-3.JPG

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

101
docs/en/Blog-Posts/2025-07-22-My-Impressionf-at-WeAreDevelopers/post.md

@ -0,0 +1,101 @@
# WeAreDevelopers 2025: A Speaker’s Impressions
![Conference Opening](IMG_15924-min.jpg)
After speaking at DotNext Moscow, I had high expectations for WeAreDevelopers 2025—and the event delivered on all fronts. Held in Berlin / Germany, it brought together a truly global crowd of developers, tech leaders, and innovators. As a speaker and software architect , I’m sharing my first-hand highlights, favorite moments, and candid scenes from this 2025’s conference.
## 🗣 My Talk
We have a good experience on multi-tenancy topic in SaaS development. My talk's topic was "Building Multi-Tenant ASP.NET Core Applications: Best Practices and Real-World Solutions". It was on the stage 4, 11 July Friday 10:20 am - 10:50 am and [this my presentation file](https://github.com/ebicoglu/presentations/blob/main/multi-tenancy-wearedevelopers-2025_30mins.pptx).
![My Talk Info](image-20250722203102576.png)
![Pictures from my talk](my-talk-1.JPG)
![Pictures from my talk](my-talk-2.JPG)
![Pictures from my talk](my-talk-3.JPG)
## 🏛 Huge Venue
![Main Stage](1752664190317-min.jpeg)
*The image is credited to WeAreDevelopers organization*
First of all, I had been in numerous software conferences, I must say that I've never seen such a big software event. The event spanned **500+ sessions across 20+ stages**, including the HR Leaders Summit for **2 full days**.
![Main Stage2](IMG_15933-min.jpg)
![Crowd Energy](IMG_15944-min.jpg)
------
## 🎤 Opening Keynote from GitHub
GitHub CEO Thomas Dohmke initiated the conference on the main stage with a talk on *“Agents for the Sake of Happiness”*. Having introduced Copilot three years ago here, he now launched bold predictions about autonomous AI‍—a fascinating evolution... He demonstrated GitHub Co-Pilot's AI and created a snake game. Altough it didn't work as he planned, we're developers we know live coding is hard. Actually that's because we shouldn't rely on AI. AI is not deterministic even though we set all those temperature, TopP, TopK parameters to minimum.
> AI is a good but not trustable friend!
![Thomas Dohmke on Stage](IMG_15941-min.jpg)
------
## 🧭 11 Parallel Stages: Rush
There were 11 stages where 11 different topics were being explained. And the sessions were 30 minutes. Actually that's the downside of this event. Because there were so nice talks that needs to be minimum 40 minutes. But anyway I understand the organization team because there are many smart speakers whose needs to be included in this event. So as a attendee I was on a hurry to pick the next talk even when I was listening to a talk :)
The venue consists of 3 buildings. So if you pick a talk on another building, you have 10 mins to go to toilet or drink something and catch the next session on that far building...
There was HR track with **3 stages and 2 full days** of HR/Talent Acquisition programming, it attracted a notable overlap of developers and HR pros. Themes included AI‑powered recruiting, remote work culture, mental health, diversity & inclusion, and building AI agents
![Fireside Chat](IMG_15949-min.jpg)
![Panel Discussion](IMG_15948-min.jpg)
------
## 🤖 AI & AI & AI & Others...
I'm one of those AI lovers. I love learning cutting-edge information. And as I see AI is being more trendy everyday. That's why most of the talks were about AI. Everything related to AI. I generaly attended AI related talks because I'm also working on some AI topics in Volosoft at the moment.
------
## 🤝 Expo Floor & Networking
The expo was a developer’s playground—cloud services, open‑source tools, startups, and enterprise platforms. I found new partners and reconnected with peers in a buzzing atmosphere. Everywhere was full of talking's even outside. If you want to get fresh air and drink coffee, you can go out and listen to the outside talks.
![Expo Hall](IMG_15956-min.jpg)
![Booth Visit](IMG_15959-min.jpg)
Networking wasn't just daytime chatter—hallway meetups and evening socials were unforgettable.
![Networking Moments](IMG_15964-min.jpg)
![After Hours](IMG_15972-min.JPG)
------
## 😂 Candid & Fun Moments
Swag stations, sponsor games, “developer selfies”—these lighter moments kept the vibe upbeat and human.
![Fun Moment](IMG_15971-min.JPG)
![Developer Selfie](IMG_15980-min.JPG)
------
## ✅ Final Thoughts & Looking Ahead
WeAreDevelopers 2025 was an unforgettable three-day ride: **15,000 tech minds**, **500+ sessions**, and a true **bridge between developers and HR**
I’m leaving with:
- Fresh strategies in GenAI and SaaS growth
- Stronger HR-tech understanding and crossover potential
- New professional connections—and fun memories
------
![Conference Wrap-Up](IMG_15999-min.jpg)

2
docs/en/Community-Articles/2024-11-25-Global-Assets/POST.md

@ -51,7 +51,7 @@ public class MyBlazorWebAssemblyBundlingModule : AbpModule
options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global).AddContributors(typeof(MyModuleBundleScriptContributor));
// Style Bundles
options.ScriptBundles.Get(BlazorWebAssemblyStandardBundles.Scripts.Global).AddContributors(typeof(MyModuleBundleStyleBundleContributor));
options.StyleBundles.Get(BlazorWebAssemblyStandardBundles.Styles.Global).AddContributors(typeof(MyModuleBundleStyleBundleContributor));
});
}
}

28
docs/en/Community-Articles/2025-07-17-summar-campaign/post.md

@ -0,0 +1,28 @@
**It is going to get hotter with ABP’s Summer Campaign!**
Since it’s summer time, we wanted to make it even hotter by announcing a summer campaign! From July 21 to 31 we are offering a 20% discount on all ABP licenses. Now is the best time to invest in ABP and start developing asp net applications faster without wasting your time with repetitive tasks.
## Summer Campaign Terms
Please review the following terms and conditions carefully.
* This offer is available for extensions and new purchases.
* Developer seat purchases are also included to the campaign.
* Campaign is available from July 21st to July 31st.
* Discounts are valid on selected licenses only.
* This offer cannot be combined with other promotions or discounts.
**Why Choose ABP?**
ABP offers a powerful infrastructure, simplifying modern ASP.NET core development. It helps develop modern ASP.NET applications, including ASP.NET core MVC web applications, blazor front-end projects, and angular .NET Core solutions.
-The core framework and pre-built modules are designed with microservice architecture in mind.
-ABP provides a module system that allows you to develop reusable application modules.
-Helps implement a DDD based layered architecture and build a maintainable code base.
-Easily manage SaaS applications with integrated multi-tenancy, from database to UI.
**This Offer Ends July 31, So Hurry Up!**
This summer campaign is running from July 21 to July 31, so don’t miss your chance. Now is the perfect opportunity to enhance your asp net web development with ABP and benefit from our exclusive features.
Get Your Discount Now: [https://abp.io/pricing?utm_source=abpwebsite&utm_medium=referral&utm_campaign=summer25_blog](https://abp.io/pricing?utm_source=abpwebsite&utm_medium=referral&utm_campaign=summer25_blog)

6
docs/en/docs-nav.json

@ -2127,11 +2127,11 @@
{
"text": "Microservice Solution",
"isLazyExpandable": true,
"path": "solution-templates/microservice",
"path": "solution-templates/microservice/index.md",
"items":[
{
"text": "Overview",
"path": "solution-templates/microservice"
"path": "solution-templates/microservice/overview.md"
},
{
"text": "Solution Structure",
@ -2187,7 +2187,7 @@
},
{
"text": "Swagger integration",
"path": "solution-templates/microservice/swagger.md"
"path": "solution-templates/microservice/swagger-integration.md"
},
{
"text": "Permission management",

17
docs/en/framework/infrastructure/json.md

@ -69,6 +69,19 @@ Add [Volo.Abp.Json.Newtonsoft](https://www.nuget.org/packages/Volo.Abp.Json.Newt
## Configuring JSON options in ASP.NET Core
You can change the JSON behavior in ASP.NET Core by configuring [JsonOptions](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.jsonoptions) or
[MvcNewtonsoftJsonOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.mvcnewtonsoftjsonoptions)(if you use `Newtonsoft.Json`)
Configuring JSON options in ABP does not affect ASP.NET Core's JSON settings. To modify ASP.NET Core JSON behavior, configure [JsonOptions](https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.jsonoptions) or [MvcNewtonsoftJsonOptions](https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.mvcnewtonsoftjsonoptions) (if you're using `Newtonsoft.Json`) separately.
Example:
```csharp
Configure<JsonOptions>(options =>
{
//options.SerializerOptions
});
// If you use Newtonsoft.Json
Configure<MvcNewtonsoftJsonOptions>(options =>
{
//options.SerializerSettings
});
```

23
docs/en/framework/ui/maui/index.md

@ -13,6 +13,8 @@ ABP Commercial platform provides a basic [MAUI](https://docs.microsoft.com/en-us
Run the backend application described in the [getting started document](../../../get-started/index.md).
## Run the Mobile Application
Open the `appsettings.json` in the `MAUI` project:
{{ if Tiered == "Yes" }}
@ -25,6 +27,12 @@ Open the `appsettings.json` in the `MAUI` project:
{{ end }}
After ensuring the backend application is running and the `appsettings.json` is properly configured in the mobile application, you can proceed to run the mobile application. You can run the application either by using the `dotnet build` command (e.g. `dotnet build -t:Run -f net9.0-android` for Android or `dotnet build -t:Run -f net9.0-ios` for iOS) or by running it through Visual Studio or any other IDE that supports MAUI.
> For more information about running the mobile application, please refer to the [Microsoft's documentation](https://learn.microsoft.com/en-us/dotnet/maui/?view=net-maui-9.0).
You can examine the [Users Page](#users-page) or any other pre-defined page to see how to use CSharp Client Proxy to request backend API and consume the backend API in the same way in your application. Also, if you encounter any errors on specific platforms, you can refer to the following sections for each platform to find common issues and their solutions.
### Android
If you get the following error when connecting to the emulator or a physical phone, you need to set up port mapping.
@ -65,10 +73,11 @@ If you run the MAUI on a Mac agent, the remote iOS Simulator can't access the ba
## User Interface
The MAUI template consists of four pages:
* **Homepage**: This is the welcome page of the application.
* **Users**: Management page for your application users. You can search, add, update, or delete users of your application.
* **Tenants**: Management page for your tenants.
* **Settings**: Management page for your application settings. On this page, you can change **the current language**, **the profile picture**, **the current password**, or/and **the current theme**.
- **Homepage**: This is the welcome page of the application.
- **Users**: Management page for your application users. You can search, add, update, or delete users of your application.
- **Tenants**: Management page for your tenants.
- **Settings**: Management page for your application settings. On this page, you can change **the current language**, **the profile picture**, **the current password**, or/and **the current theme**.
### Homepage
@ -86,12 +95,6 @@ The MAUI template consists of four pages:
![Maui Settings Page](../../../images/maui-settings-page.png)
## Run the Mobile Application
You can run the MAUI application through Visual Studio or any other IDE that supports MAUI. After the application is up and running, you can continue to develop your application based on this startup template.
You can examine the [Users Page](#users-page) or any other pre-defined page to see how to use CSharp Client Proxy to request backend API and consume the backend API in the same way in your application.
### Advanced
#### Validation

BIN
docs/en/get-started/images/abp-studio-microservice-solution-runner-applications.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/en/get-started/images/abp-studio-microservice-solution-runner.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 115 KiB

BIN
docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure-tiered.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
docs/en/get-started/images/abp-studio-new-solution-dialog-solution-structure.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 68 KiB

8
docs/en/get-started/layered-web-application.md

@ -75,8 +75,16 @@ Installing a module after creating the solution may require manual steps. So, it
Once you select the desired modules, click the *Next* button for the *Solution Structure* screen:
{{ if Tiered == "Yes" }}
![abp-studio-new-solution-dialog-solution-structure-tiered](images/abp-studio-new-solution-dialog-solution-structure-tiered.png)
{{ else }}
![abp-studio-new-solution-dialog-solution-structure](images/abp-studio-new-solution-dialog-solution-structure.png)
{{ end }}
It creates a separate host application that only serves the HTTP (REST) APIs. The web application then performs remote HTTP calls to that application for every operation. If the *Tiered* option is not selected, then the web and HTTP APIs are hosted in a single application, and the calls from the UI layer to the API layer are performed in-process.
The tiered architecture allows you to host the web (UI) application in a server that can not access to your database server. However, it brings a slight loss of performance (because of the HTTP calls between UI and HTTP API applications) and makes your architecture, development, and deployment more complex. If you don't understand the tiered structure, just skip it.

4
docs/en/get-started/microservice.md

@ -150,9 +150,9 @@ In the *Solution Runner* section (on the left side) you can see all the runnable
![abp-studio-microservice-solution-runner-applications](images/abp-studio-microservice-solution-runner-applications.png)
> A leaf item in the *Solution Runner* is called as an *Application* as it is an executable application.
> A leaf item in the *Solution Runner* is called as an *Application* as it is an executable application, excluding items under `Containers`.
As shown in the figure above, the executable applications are grouped into folders like `apps`, `gateways`, `infrastructure`, and `services`. You can start/stop them all, a group (folder) of them, or one by one.
As shown in the figure above, the executable applications are grouped into folders like `apps`, `gateways`, and `services`. You can start/stop them all, a group (folder) of them, or one by one. The `Containers` branch contains the needed docker containers for the applications.
Before running the applications, you can run the all application by right-clicking the root item in the *Solution Runner* and select *Build* -> *Build All* action. However, you don't need to do that, because ABP Studio builds the applications before running them by default.

10
docs/en/solution-templates/microservice/index.md

@ -1,5 +1,15 @@
# ABP Studio: Microservice Solution Template
````json
//[doc-nav]
{
"Next": {
"Name": "Microservice Solution: Overview",
"Path": "solution-templates/microservice/overview"
}
}
````
> You must have an ABP Business or a higher license to use this startup template.
ABP Studio provides pre-architected and production-ready templates to jump start a new solution. One of them is the Microservice solution template. You can use it to build distributed systems with common microservice patterns. It includes multiple services, API gateways and applications that are well integrated to each other and ready to be a great base solution for your microservice system.

10
docs/en/solution-templates/microservice/main-components.md

@ -1,5 +1,15 @@
# Microservice Solution: Main Components
```json
//[doc-nav]
{
"Next": {
"Name": "Microservices",
"Path": "solution-templates/microservice/microservices"
}
}
```
> You must have an ABP Business or a higher license to be able to create a microservice solution.
The solution consists of various applications, API gateways and services. The following documents explains these components in details:

BIN
docs/en/studio/images/monitoring-applications/monitoring-window-hint.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/en/studio/images/monitoring-applications/monitoring.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/en/studio/images/monitoring-applications/tools-create.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/en/studio/images/monitoring-applications/tools-overview.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

19
docs/en/studio/monitoring-applications.md

@ -10,10 +10,14 @@
}
````
ABP Studio offers a comprehensive centralized monitoring solution, enabling you to oversee all applications from a single interface. To see the monitoring tabs you can select the [Solution Runner](./running-applications.md) or *Kubernetes* from the left menu, monitoring tabs are automatically opened in the center. You can start the applications for monitoring. Various monitoring options are available, including [Overall](#overall), [Browse](#browse), [HTTP Requests](#http-requests), [Events](#events), [Exceptions](#exceptions), [Logs](#logs).
ABP Studio offers a comprehensive centralized monitoring solution, enabling you to oversee all applications from a single interface. To see the monitoring tabs you can select the [Solution Runner](./running-applications.md) or *Kubernetes* from the left menu, monitoring tabs are automatically opened in the center. You can start the applications for monitoring. Various monitoring options are available, including [Overall](#overall), [Browse](#browse), [HTTP Requests](#http-requests), [Events](#events), [Exceptions](#exceptions), [Logs](#logs), [Tools](#tools).
![monitoring](./images/monitoring-applications/monitoring.png)
If you want to open any of these tabs in separate window, just drag it from the header a little bit and it will pop-up in a new window. In this way you can monitor multiple tabs at once:
![monitoring-window-hint](./images/monitoring-applications/monitoring-window-hint.png)
## Collecting Telemetry Information
There are two application [types](./running-applications.md#abp-studio-running-applications): C# and CLI. Only C# applications can establish a connection with ABP Studio and transmit telemetry information via the `Volo.Abp.Studio.Client.AspNetCore` package. However, we can view the *Logs* and *Browse* (if there is a *Launch URL*) for both CLI and C# application types. Upon starting C# applications, they attempt to establish a connection with ABP Studio. When connection successful, you should see a chain icon next to the application name in [Solution Runner](./running-applications.md#run-1). Applications can connect the ABP Studio with *Solution Runner* -> *C# Application* -> *Run* -> *Start* or from an outside environment such as debugging with Visual Studio. Additionally, they can establish a connection from a Kubernetes Cluster through the ABP Studio [Kubernetes Integration: Connecting to the Cluster](../get-started/microservice.md#kubernetes-integration-connecting-to-the-cluster).
@ -130,3 +134,16 @@ Click on a row to inspect the details of each exception; `Application`, `Excepti
The *Logs* tab allows you to view all logs for both CLI and C# applications. To access logs, simply select an application. You can also apply filters using the search textbox by log text or by selecting a specific *Log Level*. When you select a *Log Level* it shows selected log level and higher log levels. For example, if you select *Warning* it shows *Warning*, *Error* and *Critical* logs. To clear selected application logs, use the *Clear Logs* button. If *Auto Scroll* is checked, the display automatically scrolls when new logs are received.
![logs](./images/monitoring-applications/logs.png)
## Tools
The *Tools* tab allows you to easily access to the user interfaces of the tools you are using. A *tool* may be related with a docker container, or independent. If it is related with a container (ex: *grafana*), the tool is opened when the container is up. If the tool is independent, it will be always opened.
![tools](./images/monitoring-applications/tools-overview.png)
The microservice template comes with pre-defined tools to display related container user interfaces. You can edit existing tools, add new tools or delete existing tools.
In the example below, a new tool named `My Application Status` will be added to the tools and it will display the URL in the input:
![tools-create](./images/monitoring-applications/tools-create.png)

5
docs/en/tutorials/book-store/part-05.md

@ -72,7 +72,12 @@ public class BookStorePermissionDefinitionProvider : PermissionDefinitionProvide
public override void Define(IPermissionDefinitionContext context)
{
var bookStoreGroup = context.AddGroup(BookStorePermissions.GroupName, L("Permission:BookStore"));
//Dashboard permissions
bookStoreGroup.AddPermission(BookStorePermissions.Dashboard.Host, L("Permission:Dashboard"), MultiTenancySides.Host);
bookStoreGroup.AddPermission(BookStorePermissions.Dashboard.Tenant, L("Permission:Dashboard"), MultiTenancySides.Tenant);
//Books permissions
var booksPermission = bookStoreGroup.AddPermission(BookStorePermissions.Books.Default, L("Permission:Books"));
booksPermission.AddChild(BookStorePermissions.Books.Create, L("Permission:Books.Create"));
booksPermission.AddChild(BookStorePermissions.Books.Edit, L("Permission:Books.Edit"));

1
framework/src/Volo.Abp.AspNetCore.Components.MauiBlazor.Theming.Bundling/MauiStyleContributor.cs

@ -14,5 +14,6 @@ public class MauiStyleContributor : BundleContributor
context.Files.AddIfNotContains("_content/Blazorise/blazorise.css");
context.Files.AddIfNotContains("_content/Blazorise.Bootstrap5/blazorise.bootstrap5.css");
context.Files.AddIfNotContains("_content/Blazorise.Snackbar/blazorise.snackbar.css");
context.Files.AddIfNotContains("_content/Volo.Abp.BlazoriseUI/volo.abp.blazoriseui.css");
}
}

3
framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared/wwwroot/libs/abp/aspnetcore-mvc-ui-theme-shared/toast/abp-toast.css

@ -132,7 +132,8 @@
@media only screen and (max-width: 768px) {
.abp-toast-container {
min-width: 100%;
right: 0;
right: 0 !important;
left: 0 !important;
}
.abp-toast {

2
framework/src/Volo.Abp.AutoMapper/Volo.Abp.AutoMapper.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<TargetFrameworks>net8.0;net9.0</TargetFrameworks>
<Nullable>enable</Nullable>
<WarningsAsErrors>Nullable</WarningsAsErrors>
<AssemblyName>Volo.Abp.AutoMapper</AssemblyName>

6
framework/src/Volo.Abp.BlazoriseUI/Components/EntityActions.razor.cs

@ -42,10 +42,10 @@ public partial class EntityActions<TItem> : ComponentBase
{
Actions.Add(action);
}
private bool DisabledOrNoActions()
protected virtual bool DisabledOrNoActions()
{
return Disabled || !Actions.Any(t => t is { Visible: true, HasPermission: true });
return Disabled || (Actions.Any() && Actions.All(t => !t.Visible || !t.HasPermission));
}
protected override void OnInitialized()

24
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEfCoreNavigationHelper.cs

@ -60,7 +60,7 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
return;
}
var foreignKeys = entityEntry.Metadata.GetForeignKeys().ToList();
var foreignKeys = entityEntry.Metadata.GetForeignKeys();
foreach (var foreignKey in foreignKeys)
{
var principal = stateManager.FindPrincipal(internalEntityEntityEntry, foreignKey);
@ -75,15 +75,20 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue;
}
abpEntityEntry.UpdateNavigationEntries();
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == foreignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == foreignKey);
if (navigationEntry != null && checkEntityEntryState && entityEntry.State == EntityState.Unchanged)
{
abpEntityEntry.UpdateNavigation(entityEntry, navigationEntry);
}
if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
abpEntityEntry.IsModified = true;
DetectChanges(abpEntityEntry.EntityEntry, false);
}
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == foreignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == foreignKey);
if (navigationEntry != null && IsEntityEntryChanged(entityEntry))
{
navigationEntry.IsModified = true;
@ -115,15 +120,20 @@ public class AbpEfCoreNavigationHelper : ITransientDependency
continue;
}
abpEntityEntry.UpdateNavigationEntries();
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == inverseForeignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == inverseForeignKey);
if (navigationEntry != null && checkEntityEntryState && entityEntry.State == EntityState.Unchanged)
{
abpEntityEntry.UpdateNavigation(entityEntry, navigationEntry);
}
if (!abpEntityEntry.IsModified && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
abpEntityEntry.IsModified = true;
DetectChanges(abpEntityEntry.EntityEntry, false);
}
var navigationEntry = abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is INavigation navigationMetadata && navigationMetadata.ForeignKey == inverseForeignKey) ??
abpEntityEntry.NavigationEntries.FirstOrDefault(x => x.NavigationEntry.Metadata is ISkipNavigation skipNavigationMetadata && skipNavigationMetadata.ForeignKey == inverseForeignKey);
if (navigationEntry != null && (!checkEntityEntryState || IsEntityEntryChanged(entityEntry)))
{
navigationEntry.IsModified = true;

80
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/ChangeTrackers/AbpEntityEntry.cs

@ -1,4 +1,4 @@
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
@ -21,10 +21,7 @@ public class AbpEntityEntry
{
return _isModified || EntityEntry.State == EntityState.Modified || NavigationEntries.Any(n => n.IsModified);
}
set
{
_isModified = value;
}
set => _isModified = value;
}
public AbpEntityEntry(string id, EntityEntry entityEntry)
@ -34,46 +31,29 @@ public class AbpEntityEntry
NavigationEntries = EntityEntry.Navigations.Select(x => new AbpNavigationEntry(x, x.Metadata.Name)).ToList();
}
public void UpdateNavigationEntries()
public void UpdateNavigation(EntityEntry entityEntry, AbpNavigationEntry navigationEntry)
{
foreach (var navigationEntry in NavigationEntries)
if (IsModified ||
EntityEntry.State == EntityState.Modified ||
navigationEntry.IsModified)
{
if (IsModified ||
EntityEntry.State == EntityState.Modified ||
navigationEntry.IsModified ||
navigationEntry.NavigationEntry.IsModified)
{
continue;
}
var navigation = EntityEntry.Navigations.FirstOrDefault(n => n.Metadata.Name == navigationEntry.Name);
var currentValue = AbpNavigationEntry.GetOriginalValue(navigation?.CurrentValue);
if (currentValue == null)
{
continue;
}
return;
}
switch (navigationEntry.OriginalValue)
{
case null:
navigationEntry.OriginalValue = currentValue;
break;
case IEnumerable originalValueCollection when currentValue is IEnumerable currentValueCollection:
{
var existingList = originalValueCollection.Cast<object?>().ToList();
var newList = currentValueCollection.Cast<object?>().ToList();
if (newList.Count > existingList.Count)
{
navigationEntry.OriginalValue = currentValue;
}
var currentValue = navigationEntry.NavigationEntry.CurrentValue;
if (currentValue == null)
{
return;
}
break;
}
default:
navigationEntry.OriginalValue = currentValue;
break;
}
if (navigationEntry.NavigationEntry is CollectionEntry)
{
navigationEntry.OriginalValue ??= new List<object>();
navigationEntry.OriginalValue.As<List<object>>().Add(entityEntry.Entity);
}
else
{
navigationEntry.OriginalValue = currentValue;
}
}
}
@ -86,7 +66,7 @@ public class AbpNavigationEntry
public bool IsModified { get; set; }
public List<object>? OriginalValue { get; set; }
public object? OriginalValue { get; set; }
public object? CurrentValue => NavigationEntry.CurrentValue;
@ -94,21 +74,9 @@ public class AbpNavigationEntry
{
NavigationEntry = navigationEntry;
Name = name;
OriginalValue = GetOriginalValue(navigationEntry.CurrentValue);
}
public static List<object>? GetOriginalValue(object? currentValue)
{
if (currentValue is null)
if (navigationEntry.CurrentValue != null )
{
return null;
OriginalValue = navigationEntry is CollectionEntry ? new List<object>() : navigationEntry.CurrentValue;
}
if (currentValue is IEnumerable enumerable)
{
return enumerable.Cast<object>().ToList();
}
return new List<object> { currentValue };
}
}

92
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEfCoreNavigationHelper_Tests.cs

@ -0,0 +1,92 @@
using System;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.TestApp.Domain;
using Xunit;
namespace Volo.Abp.EntityFrameworkCore;
public class AbpEfCoreNavigationHelper_Tests : EntityFrameworkCoreTestBase
{
private readonly IRepository<Blog, Guid> _blogRepository;
public AbpEfCoreNavigationHelper_Tests()
{
_blogRepository = GetRequiredService<IRepository<Blog, Guid>>();
}
[Fact]
public async Task Performance_Test()
{
//These time taken varies on different machines.
//I used relatively large values, but it can also check for performance problem.
var batchUpdateTime = TimeSpan.FromSeconds(30);
var queryTime = TimeSpan.FromSeconds(10);
if (!Environment.GetEnvironmentVariable("GITHUB_ACTIONS").IsNullOrWhiteSpace())
{
batchUpdateTime = batchUpdateTime * 6;
queryTime = queryTime * 6;
}
var stopWatch = Stopwatch.StartNew();
await WithUnitOfWorkAsync(async () =>
{
for (var i = 0; i < 5 * 1000; i++)
{
await _blogRepository.InsertAsync(
new Blog(Guid.NewGuid())
{
Name = "Blog" + i,
BlogPosts =
[
new BlogPost(Guid.NewGuid())
{
Title = "Post" + i
}
]
});
}
});
stopWatch.Stop();
stopWatch.Elapsed.ShouldBeLessThan(batchUpdateTime);
stopWatch.Restart();
var blogs = await _blogRepository.GetListAsync(includeDetails: true);
blogs.Count.ShouldBe(5 * 1000);
blogs.SelectMany(x => x.BlogPosts).Count().ShouldBe(5 * 1000);
stopWatch.Stop();
stopWatch.Elapsed.ShouldBeLessThan(queryTime);
var blogId = blogs.First().Id;
stopWatch.Restart();
await WithUnitOfWorkAsync(async () =>
{
var blog = await _blogRepository.GetAsync(blogId);
blog.ShouldNotBeNull();
for (var i = 0; i < 5 * 1000; i++)
{
blog.BlogPosts.Add(
new BlogPost(Guid.NewGuid())
{
Title = "NewPost" + i
});
}
await _blogRepository.UpdateAsync(blog);
});
stopWatch.Stop();
stopWatch.Elapsed.ShouldBeLessThan(batchUpdateTime);
stopWatch.Restart();
var blog = await _blogRepository.GetAsync(blogId);
blog.BlogPosts.Count.ShouldBe(5 * 1000 + 1);
stopWatch.Stop();
stopWatch.Elapsed.ShouldBeLessThan(queryTime);
}
}

5
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/AbpEntityFrameworkCoreTestModule.cs

@ -53,6 +53,11 @@ public class AbpEntityFrameworkCoreTestModule : AbpModule
{
opt.DefaultWithDetailsFunc = q => q.Include(p => p.OneToOne).ThenInclude(x => x.OneToOne).Include(p => p.OneToMany).ThenInclude(x => x.OneToMany).Include(p => p.ManyToMany);
});
options.Entity<Blog>(opt =>
{
opt.DefaultWithDetailsFunc = q => q.Include(p => p.BlogPosts);
});
});
context.Services.AddAbpDbContext<HostTestAppDbContext>(options =>

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save