Entity Framework Core 8 İle MongoDB Kullanımı
Merhaba,
Bu içeriğimizde sizlere, .NET uygulamalarında MongoDB kullanımını oldukça kolaylaştıran ve EF Core 8 ile hayatımıza girmiş olan MongoDB Entity Framework Core Provider‘ından bahsediyor olacağım.
Malumunuz bu güne kadar .NET uygulamalarında MongoDB’yi kullanabilmek için MongoDB.Driver kütüphanesinden istifade ediyorduk ve gerekli yapılandırmaları temel düzeyde kendimiz inşa ediyorduk. Buna örnek vermemiz gerekirse eğer; bir ‘Person’ kaydını tutabilmek için gerekli geliştirmeleri aşağıdaki gibi inşa edip çalışmalarımızı gerçekleştiriyorduk.
Entity’i oluşturuyorduk;
public class Person
{
[BsonId]
[BsonElement(Order = 0)]
public ObjectId Id { get; set; }
[BsonRepresentation(BsonType.String)]
[BsonElement(Order = 1)]
public string? Name { get; set; }
[BsonRepresentation(BsonType.String)]
[BsonElement(Order = 2)]
public string? Surname { get; set; }
[BsonRepresentation(BsonType.Int64)]
[BsonElement(Order = 3)]
public int? Age { get; set; }
}
ardından MongoDB yapılandırmasını yöneteceğimiz servisi oluşturuyorduk;
public class MongoDBService
{
readonly IMongoDatabase _database;
public MongoDBService(IConfiguration configuration)
{
MongoClient client = new("mongodb://localhost:27017");
_database = client.GetDatabase("ExampleDB");
}
public IMongoCollection<T> GetCollection<T>() => _database.GetCollection<T>(typeof(T).Name.ToLowerInvariant());
}
ve bu servisi IoC provider’ına ekleyerek ihtiyaç noktalarında aşağıdaki gibi kullanıyorduk;
builder.Services.AddSingleton<MongoDBService>();
app.MapPost("/create-person", async (PersonVM personVM, MongoDBService mongoDBService) =>
{
IMongoCollection<Person> personCollection = mongoDBService.GetCollection<Person>();
await personCollection.InsertOneAsync(new()
{
Name = personVM.Name,
Surname = personVM.Surname,
Age = personVM.Age,
});
});
app.MapGet("/get-persons", async (MongoDBService mongoDBService) =>
{
IMongoCollection<Person> personCollection = mongoDBService.GetCollection<Person>();
return await (await personCollection.FindAsync(p => true)).ToListAsync();
});
Evet, her ne kadar bu şekilde bir kullanımla uzun süredir çalışma sergilersek sergileyelim EF Core yoksunluğundan dolayı bende dahil birçoğumuz gizli serzenişte bulunmuyordu değil 🙂 Ee haliyle artık çalışmalarımızda MongoDB’yi de rahatlıkla EF Core ile yönetebilecek ve hızlıca standart sorgulama teknikleriyle iş mantığına odaklı geliştirmelerimize devam ediyor olacağız.
Bunun için MongoDB.EntityFrameworkCore kütüphanesinden yararlanacağız. İlgili kütüphaneyi projeye yükledikten sonra gerisi bilinen EF Core yapılandırmasıdır diyebiliriz. Nasıl mı?
Önce entity’i aşağıdaki gibi olabildiğince sade haliyle oluşturuyoruz;
[Collection("persons")]
public class Person
{
public ObjectId Id { get; set; }
public string? Name { get; set; }
public string? Surname { get; set; }
public int? Age { get; set; }
}
Burada Collection attribute’u adından da aşikar olduğu üzere bu entity’nin MongoDB’de hangi collection’a karşılık geldiğini ifade etmektedir. Tabi bu yapılandırmayı isterseniz aşağıdaki satırlarda göreceğimiz üzere DbContext nesnesindeki Fluent API konfigürasyonuna da bırakabilirsiniz.
Devamında bahsi geçtiği üzere EF Core’un temel yapıtaşı DbContext nesnemizi oluşturuyoruz;
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Person> Persons { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Person>()
.ToCollection("persons");
}
}
Görüldüğü üzere burada tüm entity ve konfigürasyon tanımları EF Core açısından ne biliyorsak o şekilde yapılandırılmıştır.
Ve son olarak da bu DbContext nesnesini uygulamaya AddDbContext metodu ile servis olarak ekliyoruz;
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseMongoDB("mongodb://localhost:27017", "ExampleDB"));
Bitmiştir 🙂 İşte böylece MongoDB’yi artık rahatlıkla EF Core ile kullanılabilir hale getirebiliyoruz.
app.MapPost("/create-database", async (ApplicationDbContext context) => context.Database.EnsureCreated());
app.MapPost("/create-person", async (PersonVM personVM, ApplicationDbContext context) =>
{
await context.Persons.AddAsync(personVM);
await context.SaveChangesAsync();
});
app.MapGet("/get-persons", async (ApplicationDbContext context) => await context.Persons.ToListAsync());
Bundan sonrası EF Core bilgisi gerektirdiği için tüm CRUD işlemlerini sizlere bırakıyor ve içeriğimizi burada noktalıyorum.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışmaya aşağıdaki github adresinden erişebilirsiniz.
https://github.com/gncyyldz/EFCore8.MongoDB.Example

Teşekkürler