MongoDB Entity Framework Core Provider
The MongoDB EF Core Provider enables MongoDB interaction with Entity Framework Core 8 or 9 on .NET 8.0 or later, and Entity Framework Core 10 on .NET 10.0 or later.
It supports MongoDB database server 5.0 or later, preferably in a transaction-enabled configuration.
First, create a DbContext with the desired entities and configuration:
internal class PlanetDbContext : DbContext
{
public DbSet Planets { get; init; }
public static PlanetDbContext Create(IMongoDatabase database) =>
new(new DbContextOptionsBuilder()
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
.Options);
public PlanetDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity().ToCollection("planets");
}
}
var mongoConnectionString = Environment.GetEnvironmentVariable("MONGODB_URI");
var mongoClient = new MongoClient(mongoConnectionString);
var db = PlanetDbContext.Create(mongoClient.GetDatabase("planets"));
db.Database.EnsureCreated();
var planet = db.Planets.FirstOrDefault(x => x.Name == "Earth");
var mongoConnectionString = builder.Configuration.GetConnectionString("MongoDbUri")!;
builder.Services.AddDbContext(options =>
{
options.UseMongoDB(mongoConnectionString, DatabaseName);
});
If you need some more configuration, you can create the MongoClient and inject it into the DbContext:
var mongoConnectionString = builder.Configuration.GetConnectionString("MongoDbUri")!;
var mongoUrl = new MongoUrl(mongoConnectionString);
var mongoClient = new MongoClient(mongoUrl);
builder.Services.AddSingleton(mongoClient);
builder.Services.AddDbContext((provider, options) =>
{
var client = provider.GetRequiredService();
options.UseMongoDB(client, DatabaseName);
});
Later on, simply inject PlanetDbContext where it's needed and continue as you would normally.
Entity Framework Core and MongoDB have a wide variety of features. This provider supports a subset of the functionality available in both, specifically:
Where, Find, First, Single, OrderBy, ThenBy, Skip, Take etc.VectorSearch extension method on DbSet and fluent vector index configurationAny, Count, LongCount, Sum, Min, Max, Average, All[Column] or [BsonElement] attributes or HasElementName("name") method[Table("name")], ToCollection("name") or by convention from the DbSet property nameGuid and ObjectId etc.int, string, Guid, decimal, DateOnly etc.) & MongoDB types (ObjectId, Decimal128)byte[]BsonIgnore, BsonId, BsonDateTimeOptions, BsonElement, BsonRepresentation and BsonRequired supportEnsureCreated & EnsureDeleted to ensure collections and the database created at app start-upIsConcurrencyToken/ConcurrencyCheckAttribute & IsRowVersion/TimestampAttributeSaveChanges & SaveChangesAsync - all changes committed or rolled-back togetherCamelCaseElementNameConvention for helping map Pascal-cased C# properties to camel-cased BSON elementsOfType and Where(e => e is T)ExecuteUpdate and ExecuteDelete (EF 9+) on a single collection; supports constant and self-referencing setters; bypasses the change tracker (concurrency tokens are not checked)Where-scoped sources execute as a single atomic deleteMany / updateMany server commandOrderBy/ThenBy/Skip/Take/Distinct are supported via a transactional two-phase execution (phase 1 collects the target _ids; phase 2 acts on them via { _id: { $in: [...] } }); requires a transaction-capable deployment (replica set or sharded cluster); under AutoTransactionBehavior.Never the caller must open an explicit transactionGroupBy, SelectMany, set operations, cross-document navigation predicates, or multiple-collection updatesA number of Entity Framework Core features are not currently supported but planned for future release. If you require use of these facilities in the mean-time consider using the existing MongoDB C# Driver's LINQ provider which may support them.
This project's version-numbers are aligned with Entity Framework Core and as-such we can not use the semver convention of constraining breaking changes solely to major version numbers. Please keep an eye on our Breaking Changes document before upgrading to a new version of this provider.
If you've identified a security vulnerability in a driver or any other MongoDB project, please report it according to the instructions here.
Please see our guidelines for contributing to the driver.
Thank you to everyone who has contributed to this project.
No open issues yet, or sync has not completed.