using BrightGlimmer.Data.Interfaces; using BrightGlimmer.Domain.Service; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Text; namespace BrightGlimmer.Data { public class BgContext : DbContext, IUnitOfWork { public BgContext(DbContextOptions options) : base(options) { } // dotnet ef migrations add NAME --project ./BrightGlimmer.Data --startup-project ./BrightGlimmer.Api --context BgContext // dotnet ef database update --project ./BrightGlimmer.Data --startup-project ./BrightGlimmer.Api --context BgContext protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasIndex(e => e.StudentNumber).IsUnique(); entity.HasOne(e => e.Address); entity.HasMany(e => e.Phones); entity.HasMany(e => e.AssignedCourses); }); modelBuilder.Entity() .HasOne(x => x.Course); // Make all entities soft deletables and filter by soft deleted on queries foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { entityType.GetOrAddProperty("IsDeleted", typeof(bool)); var parameter = Expression.Parameter(entityType.ClrType); var propertyMethodInfo = typeof(EF).GetMethod("Property").MakeGenericMethod(typeof(bool)); var isDeletedProperty = Expression.Call(propertyMethodInfo, parameter, Expression.Constant("IsDeleted")); BinaryExpression compareExpression = Expression.MakeBinary(ExpressionType.Equal, isDeletedProperty, Expression.Constant(false)); var lambda = Expression.Lambda(compareExpression, parameter); modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda); } } public DbSet Students { get; set; } public DbSet Courses { get; set; } public DbSet AssignedCourses { get; set; } } }