Assembly Üzerinden Dinamik EF DbContext Yönetimi | C# .Net 8
Merhaba arkadaşlar,

Dinamik EF DbContext Yönetimi
Bu makalede, EF Core kullanarak DbContext’e assembly üzerinden dinamik sınıf yüklemenin nasıl yapılacağını ve projelerimize nasıl uygulayabileceğinizi göreceğiz. Bu yöntem, özellikle büyük ve değişken projelerde veri yapılarının esnek bir şekilde yönetilmesine olanak tanır.
Bunu bir proje üzerinde uygulayalım, boş ASP.Net Core Web API .Net 8 projesi başlatalım ve ardından Entity Framework Core projemize dahil edelim.
|
1 2 |
dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.Relational |
IEntity Interface Oluşturulması
- IEntity Interface’inin Tanımlanması:
Başlangıç olarak IEntity’yi tanımlayacağız. Bu interface, tüm Entity sınıflarının implemente etmesi gereken özellikleri içerecek ve DbContext’e eklenecek class’ların IEntity implementasyonları olmasını sağlayacağız. Bu sayede, DbContext’imize dinamik olarak Entity eklemeyi mümkün kılacağız.
|
1 2 3 4 5 6 7 |
namespace EfCoreAutoIncludeDbSet.Models { public interface IEntity { } } |
- Model Sınıflarının IEntity Interface’ini Uygulaması:
Oluşturuduğumuz User modelini IEntity interfaceni implemente edeceğiz.
|
1 2 3 4 5 6 7 8 9 10 |
namespace EfCoreAutoIncludeDbSet.Models { public class User : IEntity { public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public string Password { get; set; } } } |
DbContext Oluşturulması
- AppDbContext’in Tanımlanması:
AppDbContext adından bir class oluşturalım.
|
1 2 3 4 5 6 7 8 9 10 |
namespace EfCoreAutoIncludeDbSet.Context { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } } } |
Oluşturduğumuz DbContext’te normalde Users adında bir property oluşturup kullanabiliriz. Ancak, büyüyen projelerimizde, assembly’de bulunan sınıfların dinamik olarak eklenmesini sağlayacağız. Bu yöntem, projedeki Entity sınıflarının esnek ve ölçeklenebilir bir şekilde yönetilmesine olanak tanıyacaktır.
|
1 |
public DbSet<User> Users { get; set; } |
Peki bunu nasıl yapacağız? Beraber görelim. Öncelikle, assembly içerisindeki sınıflarımızı arayacağız ve ardından bu sınıfları DbContext’e ekleyeceğiz.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
protected virtual void AddDbSetsFromAssembly(Assembly assembly, ModelBuilder modelBuilder) { try { // IEntity'yi implemente eden sınıfları bul IEnumerable<Type> entityTypes = assembly.GetTypes() .Where(t => typeof(IEntity).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract); // Bulunan her bir sınıfı ModelBuilder'a ekle foreach (Type type in entityTypes) { modelBuilder.Entity(type); // ModelBuilder'a ekleme // DbSet ve Tablo adını tanımla string dbSetName = type.Name; modelBuilder.Entity(type).ToTable(dbSetName); // Tablo adı olarak sınıf adını kullan } } catch (Exception ex) { // Hata durumunda uygun bir istisna fırlat throw new InvalidOperationException($"Assembly yüklenirken hata oluştu.", ex); } } |
Bu method ile assembly içerisindeki IEntity interface’ini implemente eden tüm sınıflar dinamik olarak DbContext’e eklenir. Şimdi bu methodu kullanalım. Kullanmak için DbContext’in OnModelCreating methodu içerisinde çağıracağız.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
namespace EfCoreAutoIncludeDbSet.Context { public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // Assembly'deki IEntity implementasyonlarını dinamik olarak ekle this.AddDbSetsFromAssembly(Assembly.GetExecutingAssembly(), modelBuilder); base.OnModelCreating(modelBuilder); } protected virtual void AddDbSetsFromAssembly(Assembly assembly, ModelBuilder modelBuilder) { try { IEnumerable<Type> entityTypes = assembly.GetTypes() .Where(t => typeof(IEntity).IsAssignableFrom(t) && t.IsClass && !t.IsAbstract); foreach (Type type in entityTypes) { modelBuilder.Entity(type); // ModelBuilder'a ekleme // DbSet ve Tablo adını tanımla string dbSetName = type.Name; modelBuilder.Entity(type).ToTable(dbSetName); } } catch (Exception ex) { throw new InvalidOperationException($"Assembly yüklenirken hata oluştu.", ex); } } } } |
Bu kodda, OnModelCreating methodunda AddDbSetsFromAssembly methodunu çağırarak assembly’deki IEntity implementasyonlarını dinamik olarak DbContext’e eklemiş oluyoruz.
O zaman eklenmiş sınıfları nasıl çaığracağız? Aşağıdaki method ile DbContext’e eklenmiş sınıfları çağırabiliriz.
|
1 2 3 4 |
public DbSet<TEntity> GetDbSet<TEntity>() where TEntity : class, IEntity, new() { return Set<TEntity>(); } |
Örnekle bakalım o zaman;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
namespace EfCoreAutoIncludeDbSet.Controllers { [ApiController] [Route("[controller]")] public class HomeController : ControllerBase { private readonly ILogger<HomeController> _logger; // Dependency Injection private readonly AppDbContext _appDbContext; public HomeController(ILogger<HomeController> logger, AppDbContext context) { _logger = logger; _appDbContext = context; } public IActionResult Index() { // DbSet'e erişim List<User> users = _appDbContext .GetDbSet<User>() .ToList(); return Ok(users); } } } |
DbContext üzerinden DbSet’lere dinamik olarak erişim sağlayarak projedeki veri modellerinin esnek bir şekilde erişim sağlamış bulunduk.
Bu yazımda sizlere, EF Core kullanarak DbContext’e dinamik sınıf yüklemenin nasıl yapılacağını ve projelerinizde bu yaklaşımı nasıl uygulayabileceğinizi anlattım. Umarım sizlere yol gösterici olmuştur.
Okdunuğunuz için teşekkür ederim.
Medium’da Yazım: Assembly Üzerinden Dinamik EF DbContext Yönetimi | C# .Net 8
.Net Hakkında Yazılarım:
Kaynaklar:
- https://romiller.com/2012/03/26/dynamically-building-a-model-with-code-first/
- https://stackoverflow.com/questions/39807101/create-table-run-time-using-entity-framework-code-first

Harikulade hocam yazılarınızın devamını diliyorum
Teşekkür ederim Fatih Bey.
Teşekkür ediyorum bu güzel yazıyı paylaştıgınız için..
Teşekkür ederim Onur Bey