Skip to content

Instantly share code, notes, and snippets.

@LuceCarter
Last active February 28, 2025 15:37
Show Gist options
  • Save LuceCarter/cde98e1cf7b79d9dc7047e9e9062231f to your computer and use it in GitHub Desktop.
Save LuceCarter/cde98e1cf7b79d9dc7047e9e9062231f to your computer and use it in GitHub Desktop.
A set of code snippets for use in the Migrating from PostgreSQL to MongoDB in an EF Core App tutorial
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.EntityFrameworkCore;
namespace MigratedMoviesEFCore.Models;
[Collection("actors")]
public class Actor
{
[BsonId]
[BsonElement("_id")]
public ObjectId Id { get; set; }
[BsonElement("name")]
public required string Name { get; set; }
[BsonElement("dateOfBirth")]
public required DateTime DateOfBirth { get; set; }
[BsonElement("placeOfBirth")]
public required string PlaceOfBirth { get; set; }
}
public interface IMovieService
{
IEnumerable<Movie> GetAllMovies();
Movie GetMovieById(string id);
void UpdateMovie(string movieId, Movie movie);
void DeleteMovie(Movie movieToDelete);
string AddMovie(Movie movie);
IEnumerable<Actor> GetAllActors();
Actor GetActorById(string id);
void UpdateActor(string id, Actor actor);
void DeleteActor(Actor actorToDelete);
string AddActor(Actor actor);
IEnumerable<Theater> GetAllTheaters();
IEnumerable<User> GetAllUsers();
}
@MigratedMoviesEFCore_HostAddress = http://localhost:5030
GET {{MigratedMoviesEFCore_HostAddress}}/movies
Accept: application/json
###
POST {{MigratedMoviesEFCore_HostAddress}}/movies
Content-Type: application/json
{
"title": "The Shawshank Redemption",
"year": 1994,
"released": "1994-09-23T00:00:00Z",
"rated": "R",
"runtime": 142,
"plot": "Two imprisoned men plot an escape",
"fullplot": "Andy Dufresne is sentenced to life in prison...",
"poster": "https://www.imdb.com/title/tt0111161/mediaviewer/rm10105600.jpg"
}
###
GET {{MigratedMoviesEFCore_HostAddress}}/movies/67c1d51f085bd3612e6d5606
###
PUT {{MigratedMoviesEFCore_HostAddress}}/movies/67c1d51f085bd3612e6d5606
Content-Type: application/json
{
"title": "The Shawshank Redemption",
"year": 1994,
"released": "1994-09-23T00:00:00Z",
"rated": "18",
"runtime": 142,
"plot": "Two imprisoned men plot an escape",
"fullplot": "Andy Dufresne is sentenced to life in prison...",
"poster": "https://www.imdb.com/title/tt0111161/mediaviewer/rm10105600.jpg"
}
###
DELETE {{MigratedMoviesEFCore_HostAddress}}/movies/67c1d51f085bd3612e6d5606
###
GET {{MigratedMoviesEFCore_HostAddress}}/actors
###
POST {{MigratedMoviesEFCore_HostAddress}}/actors
Content-Type: application/json
{
"name": "Morgan Freeman",
"dateOfBirth": "1937-06-02",
"placeOfBirth": "Memphis, Tennessee, USA"
}
###
GET {{MigratedMoviesEFCore_HostAddress}}/actors/67c1d5d9085bd3612e6d560b
###
PUT {{MigratedMoviesEFCore_HostAddress}}/actors/67c1d5d9085bd3612e6d560b
Content-Type: application/json
{
"name": "Leonardo DiCaprio",
"dateOfBirth": "1974-11-11T00:00:00.000Z",
"placeOfBirth": "Los Angeles, California, USA"
}
###
DELETE {{MigratedMoviesEFCore_HostAddress}}/actors/67c1d5d9085bd3612e6d560b
###
GET {{MigratedMoviesEFCore_HostAddress}}/theaters
###
GET {{MigratedMoviesEFCore_HostAddress}}/users
###
using System.ComponentModel.DataAnnotations;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.EntityFrameworkCore;
namespace MigratedMoviesEFCore.Models;
[Collection("movies")]
public class Movie
{
[BsonId] [BsonElement("_id")] public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[BsonElement("title")]
public required string Title { get; set; }
[BsonElement("year")]
public required int Year { get; set; }
[BsonElement("runtime")]
public required int Runtime { get; set; }
[BsonElement("plot")]
public required string Plot { get; set; }
[BsonElement("fullplot")]
public string FullPlot { get; set; }
[BsonElement("released")]
public required DateTime Released { get; set; }
[BsonElement("rated")]
public required string Rated { get; set; }
[BsonElement("poster")]
public required string Poster { get; set; }
[BsonElement("comments")]
public List<Comment>? Comments { get; set; } = new List<Comment>();
}
public class Comment
{
[BsonElement("text")]
public required string Text { get; set; }
[BsonElement("commentDate")]
public required DateTime CommentDate { get; set; }
}
protected override void OnModelCreating(ModelBuilder modelBuilder){ modelBuilder.Entity<Movie>().HasMany(m => m.Comments).WithOne().IsRequired(false);}
public Movie GetMovieById(string id)
{
return _moviesDbContext.Movies.Find(ObjectId.Parse(id));
}
public Actor GetActorById(string id)
{
return _moviesDbContext.Actors.Find(ObjectId.Parse(id));
}
public string AddMovie(Movie movie)
{
_moviesDbContext.Movies.Add(movie);
// Outputting for debugging purposes
_moviesDbContext.ChangeTracker.DetectChanges();
Console.WriteLine(_moviesDbContext.ChangeTracker.DebugView.LongView);
_moviesDbContext.SaveChanges();
return movie.Id.ToString();
}
public string AddActor(Actor actor)
{
_moviesDbContext.Actors.Add(actor);
// Outputting for debugging purposes
_moviesDbContext.ChangeTracker.DetectChanges();
Console.WriteLine(_moviesDbContext.ChangeTracker.DebugView.LongView);
_moviesDbContext.SaveChanges();
return actor.Id.ToString();
}
public void UpdateMovie(string movieId, Movie movie)
{
var movieToUpdate = _moviesDbContext.Movies.FirstOrDefault((m => m.Id == ObjectId.Parse(movieId)));
_moviesDbContext.Movies.Update(movieToUpdate);
_moviesDbContext.ChangeTracker.DetectChanges();
Console.WriteLine(_moviesDbContext.ChangeTracker.DebugView.LongView);
_moviesDbContext.SaveChanges();
}
public void UpdateActor(string actorId, Actor actor)
{
var actorToUpdate = _moviesDbContext.Actors.FirstOrDefault(a => a.Id == ObjectId.Parse(actorId));
_moviesDbContext.Actors.Update(actorToUpdate);
// Outputting for debugging purposes
_moviesDbContext.ChangeTracker.DetectChanges();
Console.WriteLine(_moviesDbContext.ChangeTracker.DebugView.LongView);
_moviesDbContext.SaveChanges();
}
using Microsoft.EntityFrameworkCore;
using MigratedMoviesEFCore.Models;
using MigratedMoviesEFCore.Services;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddOpenApi();
builder.Services.AddDbContext<MoviesDbContext>(options =>
options.UseMongoDB(builder.Configuration.GetConnectionString("MongoDBAtlasConnectionString"), "migrated_mflix")
.EnableSensitiveDataLogging());
builder.Services.AddScoped<IMovieService, MovieService>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
#region movies
app.MapGet("/movies", (IMovieService movieService) =>
{
return movieService.GetAllMovies();
})
.WithName("GetMovies");
app.MapGet("/movies/{id}", (IMovieService movieService, string id) =>
{
return movieService.GetMovieById(id);
}).WithName("GetMovieById");
app.MapPost("/movies", (IMovieService movieService, Movie movie) =>
{
string newId = movieService.AddMovie(movie);
return newId;
}).WithName("AddMovie");
app.MapPut("/movies/{id}", (IMovieService movieService, string id, Movie movieToUpdate) =>
{
movieService.UpdateMovie(id, movieToUpdate);
}).WithName("UpdateMovie");
app.MapDelete("/movies/{id}", (IMovieService movieService, string id) =>
{
var movieToDelete = movieService.GetMovieById(id);
movieService.DeleteMovie(movieToDelete);
}).WithName("DeleteMovie");
#endregion
#region actors
app.MapGet("/actors", (IMovieService movieService) =>
{
return movieService.GetAllActors();
}).WithName("GetActors");
app.MapGet("/actors/{id}", (IMovieService movieService, string id) =>
{
return movieService.GetActorById(id);
}).WithName("GetActorById");
app.MapPost("/actors", (IMovieService movieService, Actor actor) =>
{
string newId = movieService.AddActor(actor);
return newId;
}).WithName("AddActor");
app.MapPut("/actors/{id}", (IMovieService movieService, string id, Actor actorToUpdate) =>
{
movieService.UpdateActor(id, actorToUpdate);
}).WithName("UpdateActor");
app.MapDelete("/actors/{id}", (IMovieService movieService, string id) =>
{
var actorToDelete = movieService.GetActorById(id);
movieService.DeleteActor(actorToDelete);
}).WithName("DeleteActor");
#endregion
app.MapGet("/theaters", (IMovieService movieService) =>
{
return movieService.GetAllTheaters();
}).WithName("GetTheaters");
app.MapGet("/users", (IMovieService movieService) =>
{
return movieService.GetAllUsers();
}).WithName("GetUsers");
app.Run();
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.EntityFrameworkCore;
namespace MigratedMoviesEFCore.Models;
[Collection("theaters")]
public class Theater
{
[BsonId]
[BsonElement("_id")]
public ObjectId Id { get; set; }
[BsonElement("theaterName")]
public required string TheaterName { get; set; }
[BsonElement("street1")]
public string? Street1 { get; set; }
[BsonElement("street2")]
public string? Street2 { get; set; }
[BsonElement("city")]
public string? City { get; set; }
[BsonElement("state")]
public string? State { get; set; }
[BsonElement("zipcode")]
public string? Zipcode { get; set; }
[BsonElement("location_lat")]
public decimal? LocationLat { get; set; }
[BsonElement("location_lon")]
public decimal? LocationLon { get; set; }
}
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.EntityFrameworkCore;
namespace MigratedMoviesEFCore.Models;
[Collection("users")]
public class User
{
[BsonId]
[BsonElement("_id")]
public ObjectId Id { get; set; }
[BsonElement("name")]
public string? Name { get; set; }
[BsonElement("email")]
public string? Email { get; set; }
[BsonElement("password")]
public string? Password { get; set; }
[BsonElement("created_at")]
public DateTime? CreatedAt { get; set; }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment