diff --git a/src/FilterLists.Data/FilterListsDbContextExtensions.cs b/src/FilterLists.Data/FilterListsDbContextExtensions.cs index 78e6467b8..a3b80943c 100644 --- a/src/FilterLists.Data/FilterListsDbContextExtensions.cs +++ b/src/FilterLists.Data/FilterListsDbContextExtensions.cs @@ -23,13 +23,9 @@ public static bool AllMigrationsApplied(this FilterListsDbContext dbContext) return !allMigrationKeys.Except(appliedMigrationIds).Any(); } + //TODO: consider handling deleted entities on seed + //TODO: read entities from model and iterate over public static void SeedOrUpdate(this FilterListsDbContext dbContext) - { - PerformEntityInsertOnDuplicateKeyUpdates(dbContext); - //PerformEntityInserts(dbContext); - } - - private static void PerformEntityInsertOnDuplicateKeyUpdates(DbContext dbContext) { dbContext.InsertOnDuplicateKeyUpdate(); dbContext.InsertOnDuplicateKeyUpdate(); @@ -37,17 +33,14 @@ private static void PerformEntityInsertOnDuplicateKeyUpdates(DbContext dbContext dbContext.InsertOnDuplicateKeyUpdate(); dbContext.InsertOnDuplicateKeyUpdate(); dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(); + dbContext.InsertOnDuplicateKeyUpdate(); } - private static void PerformEntityInserts(DbContext dbContext) - { - dbContext.Insert(); - dbContext.Insert(); - dbContext.Insert(); - dbContext.Insert(); - dbContext.Insert(); - } - + //TODO: improve raw SQL against injection attacks private static void InsertOnDuplicateKeyUpdate(this DbContext dbContext) where TEntityType : class { var entityType = dbContext.Model.FindEntityType(typeof(TEntityType)); @@ -100,20 +93,22 @@ private static object FormatDataForMySql(IProperty property, object value) return value; } - private static string CreateUpdates(IEnumerable properties) + private static string CreateUpdates(IReadOnlyCollection properties) { - return (from property in properties + var update = + (from property in properties where !property.IsPrimaryKey() select property.Name + " = VALUES(" + property.Name + ")").Aggregate("", (updates, columnUpdates) => updates == "" ? columnUpdates : updates + ", " + columnUpdates); + if (update == "") update = GetUpdateUnchangedColumnHack(properties); + return update; } - private static void Insert(this DbContext dbContext) where TEntityType : class + //TODO: eliminate wasted IO updating unchanged column (https://stackoverflow.com/a/4596409/2343739) + private static string GetUpdateUnchangedColumnHack(IEnumerable properties) { - var rows = GetSeedRows(); - //TODO: filter out pre-existing records - dbContext.Set().AddRange(rows); - dbContext.SaveChanges(); + var firstId = properties.First(x => x.IsPrimaryKey()).Name; + return firstId + " = VALUES(" + firstId + ")"; } } } \ No newline at end of file