IW4M-Admin/SharedLibrary/Database/DatabaseContext.cs

105 lines
3.8 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharedLibrary.Database.Models;
using System.Data.SqlServerCe;
2017-11-29 19:35:50 -05:00
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Reflection;
2018-02-21 20:29:23 -05:00
using System.Data.Entity.Infrastructure;
using System.Data.Entity.SqlServerCompact;
2018-03-06 02:22:19 -05:00
using System.IO;
using System.Data.Common;
namespace SharedLibrary.Database
{
2018-02-21 20:29:23 -05:00
[DbConfigurationType(typeof(ContextConfiguration))]
2017-11-29 19:35:50 -05:00
public class DatabaseContext : DbContext
{
public DbSet<EFClient> Clients { get; set; }
public DbSet<EFAlias> Aliases { get; set; }
public DbSet<EFAliasLink> AliasLinks { get; set; }
public DbSet<EFPenalty> Penalties { get; set; }
public static string ConnectionString;
public DatabaseContext() : base(ConnectionString)
{
2018-04-07 17:47:21 -04:00
// todo: make this work with MySQL
if (!Utilities.IsRunningOnMono())
System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<DatabaseContext, Migrations.Configuration>());
2018-03-06 02:22:19 -05:00
//Database.CreateIfNotExists();
Configuration.LazyLoadingEnabled = true;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EFPenalty>()
2017-11-29 19:35:50 -05:00
.HasRequired(p => p.Offender)
.WithMany(c => c.ReceivedPenalties)
.HasForeignKey(c => c.OffenderId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<EFPenalty>()
2017-11-29 19:35:50 -05:00
.HasRequired(p => p.Punisher)
.WithMany(c => c.AdministeredPenalties)
.HasForeignKey(c => c.PunisherId)
.WillCascadeOnDelete(false);
modelBuilder.Entity<EFAliasLink>()
.HasMany(e => e.Children)
.WithRequired(a => a.Link)
.HasForeignKey(a => a.LinkId)
.WillCascadeOnDelete(true);
2017-11-29 19:35:50 -05:00
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
// https://aleemkhan.wordpress.com/2013/02/28/dynamically-adding-dbset-properties-in-dbcontext-for-entity-framework-code-first/
2018-03-06 02:22:19 -05:00
#if !DEBUG
2018-02-21 20:29:23 -05:00
foreach (string dllPath in System.IO.Directory.GetFiles($"{Utilities.OperatingDirectory}Plugins"))
2018-03-06 02:22:19 -05:00
#else
IEnumerable<string> directoryFiles;
try
{
directoryFiles = Directory.GetFiles($@"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}bin{Path.DirectorySeparatorChar}x86{Path.DirectorySeparatorChar}Debug{Path.DirectorySeparatorChar}Plugins").Where(f => f.Contains(".dll"));
}
catch (Exception)
{
directoryFiles = Directory.GetFiles($@"{Environment.CurrentDirectory}{Path.DirectorySeparatorChar}Plugins").Where(f => f.Contains(".dll"));
}
foreach (string dllPath in directoryFiles)
2018-03-06 02:22:19 -05:00
#endif
{
Assembly library;
try
{
library = Assembly.LoadFile(dllPath);
}
// not a valid assembly, ie plugin files
catch (Exception)
{
continue;
}
2018-03-06 02:22:19 -05:00
foreach (var type in library.ExportedTypes)
{
if (type.IsClass && type.IsSubclassOf(typeof(SharedEntity)))
{
var method = modelBuilder.GetType().GetMethod("Entity");
method = method.MakeGenericMethod(new Type[] { type });
method.Invoke(modelBuilder, null);
}
}
}
base.OnModelCreating(modelBuilder);
}
}
}