using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassiApp.Domain.Common; using gehGassiApp.Data.Converter; using gehGassiApp.Domain.Dogs; using gehGassiApp.Domain.Favourites; using gehGassiApp.Domain.Messages; using gehGassiApp.Domain.News; using gehGassiApp.Domain.Payment; using gehGassiApp.Domain.Users; using gehGassiApp.Domain.Walkers; using gehGassiApp.Domain.Walks; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace gehGassiApp.Data { /// /// Repräsentiert den lokalen Datenbank Kontext /// public class LocalDbContext : DbContext { public DbSet Users { get; set; } public DbSet AppUsers { get; set; } public DbSet DogWalkerProfiles { get; set; } public DbSet SyncInfosPull { get; set; } public DbSet SyncInfosPush { get; set; } public DbSet NewsCategories { get; set; } public DbSet Conversations { get; set; } public DbSet Messages { get; set; } public DbSet DogRaces { get; set; } public DbSet Dogs { get; set; } public DbSet PublicWalkRequests { get; set; } public DbSet PublicWalkResponses { get; set; } public DbSet Walks { get; set; } public DbSet WalkingTimes { get; set; } public DbSet Ratings { get; set; } public DbSet Favourites { get; set; } public DbSet SystemMessages { get; set; } public DbSet TransactionFees { get; set; } public DbSet Payouts { get; set; } //Views public DbSet PublicWalkRequestsWithNames { get; set; } private readonly string _databasePath; //Für Migrations in der Packagemanager console eingefügt /// /// Erstellt eine Instanz /// /// Pfad zur Datenbank public LocalDbContext(string databasePath) //Für Migrations in der Packagemanager console eingefügt { _databasePath = databasePath; Database.Migrate(); } /// /// Erstellt eine Instanz /// /// Datenbank Optionen public LocalDbContext(DbContextOptions options) : base(options) { } /// protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { base.OnConfiguring(optionsBuilder); if (!string.IsNullOrWhiteSpace(_databasePath)) //Für Migrations in der Packagemanager console eingefügt { optionsBuilder.UseSqlite($"Filename={_databasePath}"); } } /// protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); if (Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqlite") { // SQLite does not have proper support for DateTimeOffset via Entity Framework Core, see the limitations // here: https://docs.microsoft.com/en-us/ef/core/providers/sqlite/limitations#query-limitations // To work around this, when the Sqlite database provider is used, all model properties of type DateTimeOffset // use the DateTimeOffsetToBinaryConverter // Based on: https://github.com/aspnet/EntityFrameworkCore/issues/10784#issuecomment-415769754 // This only supports millisecond precision, but should be sufficient for most use cases. foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { var properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(DateTimeOffset) || p.PropertyType == typeof(DateTimeOffset?)); foreach (var property in properties) { modelBuilder .Entity(entityType.Name) .Property(property.Name) .HasConversion(new DateTimeOffsetToUtcDateTimeTicksConverter()); } properties = entityType.ClrType.GetProperties().Where(p => p.PropertyType == typeof(TimeSpan)); foreach (var property in properties) { modelBuilder .Entity(entityType.Name) .Property(property.Name) .HasConversion(new TimeSpanToTicksConverter()); } } } modelBuilder.Entity().OwnsOne(p => p.Address); modelBuilder.Entity().OwnsOne(p => p.Contact); modelBuilder.Entity().OwnsOne(p => p.SocialMedia); modelBuilder.Entity().OwnsOne(p => p.RatingStatistics); modelBuilder.Entity().OwnsOne(p => p.RatingStatisticsWalker); modelBuilder.Entity().HasOne().WithMany().HasForeignKey(c => c.ConversationId).OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().OwnsOne(p => p.RatingStatistics); modelBuilder.Entity().HasOne().WithMany().HasForeignKey(c => c.DogRaceId).OnDelete(DeleteBehavior.ClientSetNull); modelBuilder.Entity().OwnsOne(p => p.PickupAddress); modelBuilder.Entity().OwnsOne(p => p.PickupAddress); modelBuilder.Entity().OwnsOne(p => p.ReturnAddress); //Views modelBuilder.Entity().HasNoKey().ToView("vw_PublicWalkRequestWithNames"); } } //Für Migrations in der Packagemanager console eingefügt public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory { public LocalDbContext CreateDbContext(string[] args) { Debug.WriteLine(Directory.GetCurrentDirectory() + @"\Config.db"); return new LocalDbContext(Directory.GetCurrentDirectory() + @"\Config.db"); } } }