2016-08-24 01:32:48 +00:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using NadekoBot.Services.Database.Models;
|
2016-10-10 04:38:20 +00:00
|
|
|
|
using NadekoBot.Extensions;
|
2017-09-10 01:52:34 +00:00
|
|
|
|
using System;
|
2017-09-16 00:10:22 +00:00
|
|
|
|
using Microsoft.EntityFrameworkCore.Design;
|
2017-09-17 05:28:48 +00:00
|
|
|
|
using Microsoft.Data.Sqlite;
|
|
|
|
|
using System.IO;
|
2016-08-24 01:32:48 +00:00
|
|
|
|
|
|
|
|
|
namespace NadekoBot.Services.Database
|
|
|
|
|
{
|
2017-09-16 00:10:22 +00:00
|
|
|
|
public class NadekoContextFactory : IDesignTimeDbContextFactory<NadekoContext>
|
2017-09-17 05:28:48 +00:00
|
|
|
|
{
|
2017-09-16 00:10:22 +00:00
|
|
|
|
public NadekoContext CreateDbContext(string[] args)
|
2017-01-22 20:06:10 +00:00
|
|
|
|
{
|
2017-09-16 00:10:22 +00:00
|
|
|
|
var optionsBuilder = new DbContextOptionsBuilder<NadekoContext>();
|
2017-09-17 05:28:48 +00:00
|
|
|
|
var builder = new SqliteConnectionStringBuilder("Data Source=data/NadekoBot.db");
|
|
|
|
|
builder.DataSource = Path.Combine(AppContext.BaseDirectory, builder.DataSource);
|
|
|
|
|
optionsBuilder.UseSqlite(builder.ToString());
|
2017-06-21 22:12:29 +00:00
|
|
|
|
var ctx = new NadekoContext(optionsBuilder.Options);
|
2017-06-21 22:22:50 +00:00
|
|
|
|
ctx.Database.SetCommandTimeout(60);
|
2017-06-21 22:12:29 +00:00
|
|
|
|
return ctx;
|
2017-01-22 20:06:10 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-15 11:01:02 +00:00
|
|
|
|
public class NadekoContext : DbContext
|
2016-08-24 01:32:48 +00:00
|
|
|
|
{
|
2016-08-24 19:38:17 +00:00
|
|
|
|
public DbSet<Quote> Quotes { get; set; }
|
|
|
|
|
public DbSet<Donator> Donators { get; set; }
|
2016-08-24 23:41:11 +00:00
|
|
|
|
public DbSet<GuildConfig> GuildConfigs { get; set; }
|
2016-08-25 17:23:47 +00:00
|
|
|
|
public DbSet<ClashWar> ClashOfClans { get; set; }
|
|
|
|
|
public DbSet<ClashCaller> ClashCallers { get; set; }
|
2016-08-25 22:05:29 +00:00
|
|
|
|
public DbSet<Reminder> Reminders { get; set; }
|
2016-08-26 17:25:54 +00:00
|
|
|
|
public DbSet<SelfAssignedRole> SelfAssignableRoles { get; set; }
|
2016-08-28 00:46:36 +00:00
|
|
|
|
public DbSet<BotConfig> BotConfig { get; set; }
|
2016-08-30 01:17:16 +00:00
|
|
|
|
public DbSet<Currency> Currency { get; set; }
|
2016-09-04 13:11:02 +00:00
|
|
|
|
public DbSet<ConvertUnit> ConversionUnits { get; set; }
|
2016-10-01 03:49:05 +00:00
|
|
|
|
public DbSet<MusicPlaylist> MusicPlaylists { get; set; }
|
2016-10-08 02:25:12 +00:00
|
|
|
|
public DbSet<CustomReaction> CustomReactions { get; set; }
|
2016-10-15 00:58:15 +00:00
|
|
|
|
public DbSet<CurrencyTransaction> CurrencyTransactions { get; set; }
|
2016-11-27 02:51:10 +00:00
|
|
|
|
public DbSet<UserPokeTypes> PokeGame { get; set; }
|
2017-01-22 20:06:10 +00:00
|
|
|
|
public DbSet<WaifuUpdate> WaifuUpdates { get; set; }
|
2017-03-30 01:51:54 +00:00
|
|
|
|
public DbSet<Warning> Warnings { get; set; }
|
2017-08-22 03:48:45 +00:00
|
|
|
|
public DbSet<UserXpStats> UserXpStats { get; set; }
|
2017-09-10 01:52:34 +00:00
|
|
|
|
public DbSet<ClubInfo> Clubs { get; set; }
|
2016-08-24 01:32:48 +00:00
|
|
|
|
|
2016-09-05 10:27:58 +00:00
|
|
|
|
//logging
|
|
|
|
|
public DbSet<LogSetting> LogSettings { get; set; }
|
|
|
|
|
public DbSet<IgnoredLogChannel> IgnoredLogChannels { get; set; }
|
|
|
|
|
public DbSet<IgnoredVoicePresenceChannel> IgnoredVoicePresenceCHannels { get; set; }
|
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
//orphans xD
|
|
|
|
|
public DbSet<EightBallResponse> EightBallResponses { get; set; }
|
|
|
|
|
public DbSet<RaceAnimal> RaceAnimals { get; set; }
|
|
|
|
|
public DbSet<ModulePrefix> ModulePrefixes { get; set; }
|
2017-04-01 22:01:02 +00:00
|
|
|
|
public DbSet<RewardedUser> RewardedUsers { get; set; }
|
2016-09-10 19:40:25 +00:00
|
|
|
|
|
2017-09-16 00:10:22 +00:00
|
|
|
|
public NadekoContext(DbContextOptions<NadekoContext> options) : base(options)
|
2016-11-15 11:01:02 +00:00
|
|
|
|
{
|
2016-09-14 01:38:44 +00:00
|
|
|
|
}
|
2017-01-10 12:37:35 +00:00
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
public void EnsureSeedData()
|
|
|
|
|
{
|
|
|
|
|
if (!BotConfig.Any())
|
|
|
|
|
{
|
|
|
|
|
var bc = new BotConfig();
|
|
|
|
|
|
2016-10-10 04:38:20 +00:00
|
|
|
|
bc.RaceAnimals.AddRange(new HashSet<RaceAnimal>
|
2016-09-10 19:40:25 +00:00
|
|
|
|
{
|
|
|
|
|
new RaceAnimal { Icon = "🐼", Name = "Panda" },
|
|
|
|
|
new RaceAnimal { Icon = "🐻", Name = "Bear" },
|
|
|
|
|
new RaceAnimal { Icon = "🐧", Name = "Pengu" },
|
|
|
|
|
new RaceAnimal { Icon = "🐨", Name = "Koala" },
|
|
|
|
|
new RaceAnimal { Icon = "🐬", Name = "Dolphin" },
|
|
|
|
|
new RaceAnimal { Icon = "🐞", Name = "Ladybird" },
|
|
|
|
|
new RaceAnimal { Icon = "🦀", Name = "Crab" },
|
|
|
|
|
new RaceAnimal { Icon = "🦄", Name = "Unicorn" }
|
|
|
|
|
});
|
2016-10-10 04:38:20 +00:00
|
|
|
|
bc.EightBallResponses.AddRange(new HashSet<EightBallResponse>
|
2016-09-10 19:40:25 +00:00
|
|
|
|
{
|
|
|
|
|
new EightBallResponse() { Text = "Most definitely yes" },
|
|
|
|
|
new EightBallResponse() { Text = "For sure" },
|
|
|
|
|
new EightBallResponse() { Text = "Totally!" },
|
|
|
|
|
new EightBallResponse() { Text = "Of course!" },
|
|
|
|
|
new EightBallResponse() { Text = "As I see it, yes" },
|
|
|
|
|
new EightBallResponse() { Text = "My sources say yes" },
|
|
|
|
|
new EightBallResponse() { Text = "Yes" },
|
|
|
|
|
new EightBallResponse() { Text = "Most likely" },
|
|
|
|
|
new EightBallResponse() { Text = "Perhaps" },
|
|
|
|
|
new EightBallResponse() { Text = "Maybe" },
|
|
|
|
|
new EightBallResponse() { Text = "Not sure" },
|
|
|
|
|
new EightBallResponse() { Text = "It is uncertain" },
|
|
|
|
|
new EightBallResponse() { Text = "Ask me again later" },
|
|
|
|
|
new EightBallResponse() { Text = "Don't count on it" },
|
|
|
|
|
new EightBallResponse() { Text = "Probably not" },
|
|
|
|
|
new EightBallResponse() { Text = "Very doubtful" },
|
|
|
|
|
new EightBallResponse() { Text = "Most likely no" },
|
|
|
|
|
new EightBallResponse() { Text = "Nope" },
|
|
|
|
|
new EightBallResponse() { Text = "No" },
|
|
|
|
|
new EightBallResponse() { Text = "My sources say no" },
|
|
|
|
|
new EightBallResponse() { Text = "Dont even think about it" },
|
|
|
|
|
new EightBallResponse() { Text = "Definitely no" },
|
|
|
|
|
new EightBallResponse() { Text = "NO - It may cause disease contraction" }
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
BotConfig.Add(bc);
|
|
|
|
|
|
|
|
|
|
this.SaveChanges();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-08-24 13:29:01 +00:00
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
|
|
|
{
|
|
|
|
|
#region QUOTES
|
2016-08-24 17:04:24 +00:00
|
|
|
|
|
2017-02-14 13:30:21 +00:00
|
|
|
|
//var quoteEntity = modelBuilder.Entity<Quote>();
|
2016-08-24 13:29:01 +00:00
|
|
|
|
|
2016-08-24 17:04:24 +00:00
|
|
|
|
#endregion
|
2016-08-28 00:46:36 +00:00
|
|
|
|
|
2016-08-24 17:04:24 +00:00
|
|
|
|
#region Donators
|
2016-08-24 13:29:01 +00:00
|
|
|
|
|
2016-08-24 17:04:24 +00:00
|
|
|
|
var donatorEntity = modelBuilder.Entity<Donator>();
|
|
|
|
|
donatorEntity
|
|
|
|
|
.HasIndex(d => d.UserId)
|
2016-08-24 13:29:01 +00:00
|
|
|
|
.IsUnique();
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
#region GuildConfig
|
2016-08-24 17:04:24 +00:00
|
|
|
|
|
2016-08-24 23:41:11 +00:00
|
|
|
|
var configEntity = modelBuilder.Entity<GuildConfig>();
|
2016-08-24 17:04:24 +00:00
|
|
|
|
configEntity
|
|
|
|
|
.HasIndex(c => c.GuildId)
|
|
|
|
|
.IsUnique();
|
|
|
|
|
|
2017-01-10 19:37:41 +00:00
|
|
|
|
modelBuilder.Entity<AntiSpamSetting>()
|
|
|
|
|
.HasOne(x => x.GuildConfig)
|
|
|
|
|
.WithOne(x => x.AntiSpamSetting);
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<AntiRaidSetting>()
|
|
|
|
|
.HasOne(x => x.GuildConfig)
|
|
|
|
|
.WithOne(x => x.AntiRaidSetting);
|
|
|
|
|
|
2017-09-22 04:59:57 +00:00
|
|
|
|
modelBuilder.Entity<FeedSub>()
|
|
|
|
|
.HasAlternateKey(x => new { x.GuildConfigId, x.Url });
|
|
|
|
|
|
2017-01-10 19:37:41 +00:00
|
|
|
|
//modelBuilder.Entity<ProtectionIgnoredChannel>()
|
|
|
|
|
// .HasAlternateKey(c => new { c.ChannelId, c.ProtectionType });
|
|
|
|
|
|
2016-08-24 13:29:01 +00:00
|
|
|
|
#endregion
|
2016-08-25 17:23:47 +00:00
|
|
|
|
|
2017-07-14 03:00:30 +00:00
|
|
|
|
#region streamrole
|
|
|
|
|
modelBuilder.Entity<StreamRoleSettings>()
|
|
|
|
|
.HasOne(x => x.GuildConfig)
|
|
|
|
|
.WithOne(x => x.StreamRole);
|
|
|
|
|
#endregion
|
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
#region BotConfig
|
2017-09-10 01:52:34 +00:00
|
|
|
|
var botConfigEntity = modelBuilder.Entity<BotConfig>();
|
|
|
|
|
|
|
|
|
|
botConfigEntity.Property(x => x.XpMinutesTimeout)
|
|
|
|
|
.HasDefaultValue(5);
|
|
|
|
|
|
|
|
|
|
botConfigEntity.Property(x => x.XpPerMessage)
|
|
|
|
|
.HasDefaultValue(3);
|
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
//botConfigEntity
|
|
|
|
|
// .HasMany(c => c.ModulePrefixes)
|
|
|
|
|
// .WithOne(mp => mp.BotConfig)
|
|
|
|
|
// .HasForeignKey(mp => mp.BotConfigId);
|
2017-07-14 03:00:30 +00:00
|
|
|
|
|
2016-09-10 19:40:25 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
2016-08-25 17:23:47 +00:00
|
|
|
|
#region ClashOfClans
|
|
|
|
|
|
|
|
|
|
var callersEntity = modelBuilder.Entity<ClashCaller>();
|
|
|
|
|
callersEntity
|
|
|
|
|
.HasOne(c => c.ClashWar)
|
|
|
|
|
.WithMany(c => c.Bases);
|
|
|
|
|
|
|
|
|
|
#endregion
|
2016-08-26 17:25:54 +00:00
|
|
|
|
|
|
|
|
|
#region Self Assignable Roles
|
|
|
|
|
|
|
|
|
|
var selfassignableRolesEntity = modelBuilder.Entity<SelfAssignedRole>();
|
|
|
|
|
|
|
|
|
|
selfassignableRolesEntity
|
|
|
|
|
.HasIndex(s => new { s.GuildId, s.RoleId })
|
|
|
|
|
.IsUnique();
|
|
|
|
|
|
|
|
|
|
#endregion
|
2016-08-28 20:59:12 +00:00
|
|
|
|
|
2016-08-30 01:17:16 +00:00
|
|
|
|
#region Currency
|
|
|
|
|
var currencyEntity = modelBuilder.Entity<Currency>();
|
|
|
|
|
|
|
|
|
|
currencyEntity
|
|
|
|
|
.HasIndex(c => c.UserId)
|
|
|
|
|
.IsUnique();
|
|
|
|
|
#endregion
|
2016-09-05 10:27:58 +00:00
|
|
|
|
|
2016-09-27 13:26:37 +00:00
|
|
|
|
#region Permission
|
|
|
|
|
var permissionEntity = modelBuilder.Entity<Permission>();
|
|
|
|
|
permissionEntity
|
|
|
|
|
.HasOne(p => p.Next)
|
2016-10-07 13:00:42 +00:00
|
|
|
|
.WithOne(p => p.Previous)
|
|
|
|
|
.IsRequired(false);
|
2016-09-27 13:26:37 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
2016-09-05 10:27:58 +00:00
|
|
|
|
#region LogSettings
|
|
|
|
|
|
|
|
|
|
//var logSettingEntity = modelBuilder.Entity<LogSetting>();
|
|
|
|
|
|
|
|
|
|
//logSettingEntity
|
|
|
|
|
// .HasMany(ls => ls.IgnoredChannels)
|
|
|
|
|
// .WithOne(ls => ls.LogSetting)
|
|
|
|
|
// .HasPrincipalKey(ls => ls.id;
|
|
|
|
|
|
|
|
|
|
//logSettingEntity
|
|
|
|
|
// .HasMany(ls => ls.IgnoredVoicePresenceChannelIds)
|
|
|
|
|
// .WithOne(ls => ls.LogSetting);
|
|
|
|
|
#endregion
|
2016-10-02 01:00:03 +00:00
|
|
|
|
|
|
|
|
|
#region MusicPlaylists
|
|
|
|
|
var musicPlaylistEntity = modelBuilder.Entity<MusicPlaylist>();
|
|
|
|
|
|
|
|
|
|
musicPlaylistEntity
|
2016-10-02 02:15:57 +00:00
|
|
|
|
.HasMany(p => p.Songs)
|
2016-10-02 01:00:03 +00:00
|
|
|
|
.WithOne()
|
2017-09-16 00:10:22 +00:00
|
|
|
|
.OnDelete(DeleteBehavior.Cascade);
|
2016-11-27 02:51:10 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region PokeGame
|
|
|
|
|
var pokeGameEntity = modelBuilder.Entity<UserPokeTypes>();
|
|
|
|
|
|
|
|
|
|
pokeGameEntity
|
|
|
|
|
.HasIndex(pt => pt.UserId)
|
|
|
|
|
.IsUnique();
|
|
|
|
|
|
2016-10-02 01:00:03 +00:00
|
|
|
|
|
2017-01-10 19:37:41 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
2017-01-12 19:19:56 +00:00
|
|
|
|
#region CommandPrice
|
2017-01-14 16:37:11 +00:00
|
|
|
|
//well, i failed
|
2017-01-12 19:19:56 +00:00
|
|
|
|
modelBuilder.Entity<CommandPrice>()
|
|
|
|
|
.HasIndex(cp => cp.Price)
|
|
|
|
|
.IsUnique();
|
2017-01-14 16:37:11 +00:00
|
|
|
|
|
|
|
|
|
//modelBuilder.Entity<CommandCost>()
|
|
|
|
|
// .HasIndex(cp => cp.CommandName)
|
|
|
|
|
// .IsUnique();
|
2016-10-02 01:00:03 +00:00
|
|
|
|
#endregion
|
2017-01-22 20:06:10 +00:00
|
|
|
|
|
|
|
|
|
#region Waifus
|
|
|
|
|
|
|
|
|
|
var wi = modelBuilder.Entity<WaifuInfo>();
|
|
|
|
|
wi.HasOne(x => x.Waifu)
|
|
|
|
|
.WithOne();
|
|
|
|
|
// //.HasForeignKey<WaifuInfo>(w => w.WaifuId)
|
|
|
|
|
// //.IsRequired(true);
|
|
|
|
|
|
|
|
|
|
//wi.HasOne(x => x.Claimer)
|
|
|
|
|
// .WithOne();
|
|
|
|
|
// //.HasForeignKey<WaifuInfo>(w => w.ClaimerId)
|
|
|
|
|
// //.IsRequired(false);
|
2017-09-10 01:52:34 +00:00
|
|
|
|
#endregion
|
2017-01-22 20:06:10 +00:00
|
|
|
|
|
2017-09-10 01:52:34 +00:00
|
|
|
|
#region DiscordUser
|
|
|
|
|
|
2017-01-22 20:06:10 +00:00
|
|
|
|
var du = modelBuilder.Entity<DiscordUser>();
|
|
|
|
|
du.HasAlternateKey(w => w.UserId);
|
2017-09-10 01:52:34 +00:00
|
|
|
|
du.HasOne(x => x.Club)
|
|
|
|
|
.WithMany(x => x.Users)
|
|
|
|
|
.IsRequired(false);
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<DiscordUser>()
|
|
|
|
|
.Property(x => x.LastLevelUp)
|
2017-09-23 01:32:12 +00:00
|
|
|
|
.HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 305, DateTimeKind.Local));
|
2017-01-22 20:06:10 +00:00
|
|
|
|
|
|
|
|
|
#endregion
|
2017-03-30 01:51:54 +00:00
|
|
|
|
|
|
|
|
|
#region Warnings
|
|
|
|
|
var warn = modelBuilder.Entity<Warning>();
|
|
|
|
|
#endregion
|
2017-04-01 22:01:02 +00:00
|
|
|
|
|
|
|
|
|
#region PatreonRewards
|
|
|
|
|
var pr = modelBuilder.Entity<RewardedUser>();
|
|
|
|
|
pr.HasIndex(x => x.UserId)
|
|
|
|
|
.IsUnique();
|
|
|
|
|
#endregion
|
2017-08-22 03:48:45 +00:00
|
|
|
|
|
2017-09-10 01:52:34 +00:00
|
|
|
|
#region XpStats
|
2017-08-22 03:48:45 +00:00
|
|
|
|
modelBuilder.Entity<UserXpStats>()
|
|
|
|
|
.HasIndex(x => new { x.UserId, x.GuildId })
|
|
|
|
|
.IsUnique();
|
2017-09-10 01:52:34 +00:00
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<UserXpStats>()
|
|
|
|
|
.Property(x => x.LastLevelUp)
|
2017-09-23 01:32:12 +00:00
|
|
|
|
.HasDefaultValue(new DateTime(2017, 9, 21, 20, 53, 13, 307, DateTimeKind.Local));
|
|
|
|
|
|
2017-08-22 03:48:45 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region XpSettings
|
|
|
|
|
modelBuilder.Entity<XpSettings>()
|
|
|
|
|
.HasOne(x => x.GuildConfig)
|
|
|
|
|
.WithOne(x => x.XpSettings);
|
|
|
|
|
#endregion
|
2017-10-09 00:52:46 +00:00
|
|
|
|
|
2017-09-10 01:52:34 +00:00
|
|
|
|
#region XpRoleReward
|
|
|
|
|
modelBuilder.Entity<XpRoleReward>()
|
2017-09-23 01:32:12 +00:00
|
|
|
|
.HasIndex(x => new { x.XpSettingsId, x.Level })
|
|
|
|
|
.IsUnique();
|
2017-09-10 01:52:34 +00:00
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Club
|
|
|
|
|
var ci = modelBuilder.Entity<ClubInfo>();
|
|
|
|
|
ci.HasOne(x => x.Owner)
|
|
|
|
|
.WithOne()
|
|
|
|
|
.HasForeignKey<ClubInfo>(x => x.OwnerId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ci.HasAlternateKey(x => new { x.Name, x.Discrim });
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region ClubManytoMany
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubApplicants>()
|
2017-09-15 20:17:31 +00:00
|
|
|
|
.HasKey(t => new { t.ClubId, t.UserId });
|
2017-09-10 01:52:34 +00:00
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubApplicants>()
|
|
|
|
|
.HasOne(pt => pt.User)
|
|
|
|
|
.WithMany();
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubApplicants>()
|
|
|
|
|
.HasOne(pt => pt.Club)
|
|
|
|
|
.WithMany(x => x.Applicants);
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubBans>()
|
2017-09-15 20:17:31 +00:00
|
|
|
|
.HasKey(t => new { t.ClubId, t.UserId });
|
2017-09-10 01:52:34 +00:00
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubBans>()
|
|
|
|
|
.HasOne(pt => pt.User)
|
|
|
|
|
.WithMany();
|
|
|
|
|
|
|
|
|
|
modelBuilder.Entity<ClubBans>()
|
|
|
|
|
.HasOne(pt => pt.Club)
|
|
|
|
|
.WithMany(x => x.Bans);
|
|
|
|
|
|
|
|
|
|
#endregion
|
2016-08-24 13:29:01 +00:00
|
|
|
|
}
|
2016-08-24 01:32:48 +00:00
|
|
|
|
}
|
|
|
|
|
}
|