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");
}
}
}