You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
DreamsCaster/DreamsCaster/AppDbContext.cs

62 lines
1.9 KiB

using System.ComponentModel.DataAnnotations.Schema;
using DreamsCaster.Models;
using Microsoft.EntityFrameworkCore;
using Console = DreamsCaster.Models.Console;
namespace DreamsCaster;
public class AppDbContext : DbContext
{
public DbSet<Game> Games { get; set; }
public DbSet<Console> Consoles { get; set; }
public DbSet<Developer> Developers { get; set; }
public DbSet<Publisher> Publishers { get; set; }
public DbSet<Manufacturer> Manufacturers { get; set; }
public DbSet<Release> Releases { get; set; }
public DbSet<MetaData<Game>> GamesMetaData { get; set; }
public DbSet<MetaData<Console>> ConsolesMetaData { get; set; }
public DbSet<MetaData<Developer>> DevelopersMetaData { get; set; }
public DbSet<MetaData<Publisher>> PublishersMetaData { get; set; }
public DbSet<MetaData<Manufacturer>> ManufacturersMetaData { get; set; }
public AppDbContext() : base() { }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
ConfigureMetaDataFor<Console>(modelBuilder);
ConfigureMetaDataFor<Game>(modelBuilder);
ConfigureMetaDataFor<Publisher>(modelBuilder);
ConfigureMetaDataFor<Developer>(modelBuilder);
ConfigureMetaDataFor<Manufacturer>(modelBuilder);
}
void ConfigureMetaDataFor<T>(ModelBuilder modelBuilder) where T : MetaDataContainer<T>
{
modelBuilder.Entity<T>()
.HasOne(a => a.Data)
.WithOne(b => b.Owner)
.HasForeignKey<MetaData<T>>(c => c.OwnerId)
.OnDelete(DeleteBehavior.Cascade);
}
}
public static class DatabaseExtensions
{
public static bool TryGet<T>(this IEnumerable<T> haystack, Guid id, out T val) where T : IdEntity
{
if (haystack.Select(hay => hay.Id).Contains(id))
{
val = haystack.FirstOrDefault(hay => hay.Id.Equals(id));
return true;
}
val = null;
return false;
}
}