|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 852 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 749 KiB |
|
After Width: | Height: | Size: 779 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 697 KiB |
|
After Width: | Height: | Size: 852 KiB |
|
After Width: | Height: | Size: 738 KiB |
|
After Width: | Height: | Size: 993 KiB |
|
After Width: | Height: | Size: 802 KiB |
|
After Width: | Height: | Size: 633 KiB |
|
After Width: | Height: | Size: 970 KiB |
|
After Width: | Height: | Size: 779 KiB |
|
After Width: | Height: | Size: 518 KiB |
|
After Width: | Height: | Size: 630 KiB |
|
After Width: | Height: | Size: 674 KiB |
|
After Width: | Height: | Size: 228 KiB |
|
After Width: | Height: | Size: 267 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 206 KiB |
|
After Width: | Height: | Size: 206 KiB |
|
After Width: | Height: | Size: 241 KiB |
|
After Width: | Height: | Size: 156 KiB |
|
After Width: | Height: | Size: 347 KiB |
|
After Width: | Height: | Size: 210 KiB |
|
After Width: | Height: | Size: 174 KiB |
|
After Width: | Height: | Size: 182 KiB |
|
After Width: | Height: | Size: 925 KiB |
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 200 KiB |
|
After Width: | Height: | Size: 163 KiB |
|
After Width: | Height: | Size: 968 KiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.1 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 859 KiB |
|
After Width: | Height: | Size: 604 KiB |
|
After Width: | Height: | Size: 984 KiB |
|
After Width: | Height: | Size: 201 KiB |
|
After Width: | Height: | Size: 994 KiB |
|
After Width: | Height: | Size: 983 KiB |
|
After Width: | Height: | Size: 788 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 980 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 259 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 259 KiB |
|
After Width: | Height: | Size: 472 KiB |
|
After Width: | Height: | Size: 354 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 254 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 265 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 355 KiB |
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 602 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 516 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 1.3 MiB |
@ -0,0 +1,101 @@ |
|||
# WeAreDevelopers 2025: A Speaker’s Impressions |
|||
|
|||
 |
|||
|
|||
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). |
|||
|
|||
 |
|||
|
|||
 |
|||
 |
|||
 |
|||
|
|||
|
|||
## 🏛 Huge Venue |
|||
|
|||
 |
|||
*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**. |
|||
|
|||
 |
|||
 |
|||
|
|||
------ |
|||
|
|||
## 🎤 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! |
|||
|
|||
 |
|||
|
|||
------ |
|||
|
|||
## 🧭 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 |
|||
|
|||
 |
|||
 |
|||
|
|||
|
|||
------ |
|||
|
|||
## 🤖 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. |
|||
|
|||
 |
|||
 |
|||
|
|||
|
|||
|
|||
Networking wasn't just daytime chatter—hallway meetups and evening socials were unforgettable. |
|||
|
|||
 |
|||
 |
|||
|
|||
------ |
|||
|
|||
## 😂 Candid & Fun Moments |
|||
|
|||
Swag stations, sponsor games, “developer selfies”—these lighter moments kept the vibe upbeat and human. |
|||
|
|||
 |
|||
 |
|||
|
|||
------ |
|||
|
|||
## ✅ 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 |
|||
|
|||
|
|||
------ |
|||
|
|||
 |
|||
|
|||
|
|||
|
|||
@ -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) |
|||
|
Before Width: | Height: | Size: 39 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 68 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 174 KiB |
@ -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); |
|||
} |
|||
} |
|||