diff --git a/src/NzbDrone.Core/Datastore/Migration/028_clean_artistmetadata_table.cs b/src/NzbDrone.Core/Datastore/Migration/028_clean_artistmetadata_table.cs
new file mode 100644
index 000000000..51e835358
--- /dev/null
+++ b/src/NzbDrone.Core/Datastore/Migration/028_clean_artistmetadata_table.cs
@@ -0,0 +1,55 @@
+using FluentMigrator;
+using NzbDrone.Core.Datastore.Migration.Framework;
+
+namespace NzbDrone.Core.Datastore.Migration
+{
+ [Migration(028)]
+ public class clean_artist_metadata_table : NzbDroneMigrationBase
+ {
+ protected override void MainDbUpgrade()
+ {
+ // Remove any artists linked to missing metadata
+ Execute.Sql(@"DELETE FROM Artists
+ WHERE Id in (
+ SELECT Artists.Id from Artists
+ LEFT OUTER JOIN ArtistMetadata ON Artists.ArtistMetadataId = ArtistMetadata.Id
+ WHERE ArtistMetadata.Id IS NULL)");
+
+ // Remove any albums linked to missing metadata
+ Execute.Sql(@"DELETE FROM Albums
+ WHERE Id in (
+ SELECT Albums.Id from Albums
+ LEFT OUTER JOIN ArtistMetadata ON Albums.ArtistMetadataId = ArtistMetadata.Id
+ WHERE ArtistMetadata.Id IS NULL)");
+
+ // Remove any album releases linked to albums that were deleted
+ Execute.Sql(@"DELETE FROM AlbumReleases
+ WHERE Id in (
+ SELECT AlbumReleases.Id from AlbumReleases
+ LEFT OUTER JOIN Albums ON Albums.Id = AlbumReleases.AlbumId
+ WHERE Albums.Id IS NULL)");
+
+ // Remove any tracks linked to album releases that were deleted
+ Execute.Sql(@"DELETE FROM Tracks
+ WHERE Id in (
+ SELECT Tracks.Id from Tracks
+ LEFT OUTER JOIN AlbumReleases ON Tracks.AlbumReleaseId = AlbumReleases.Id
+ WHERE AlbumReleases.Id IS NULL)");
+
+ // Remove any tracks linked to the original missing metadata
+ Execute.Sql(@"DELETE FROM Tracks
+ WHERE Id in (
+ SELECT Tracks.Id from Tracks
+ LEFT OUTER JOIN ArtistMetadata ON Tracks.ArtistMetadataId = ArtistMetadata.Id
+ WHERE ArtistMetadata.Id IS NULL)");
+
+ // Remove any trackfiles linked to the deleted tracks
+ Execute.Sql(@"DELETE FROM TrackFiles
+ WHERE Id IN (
+ SELECT TrackFiles.Id FROM TrackFiles
+ LEFT OUTER JOIN Tracks
+ ON TrackFiles.Id = Tracks.TrackFileId
+ WHERE Tracks.Id IS NULL)");
+ }
+ }
+}
diff --git a/src/NzbDrone.Core/NzbDrone.Core.csproj b/src/NzbDrone.Core/NzbDrone.Core.csproj
index 3a85b3ef5..656cef105 100644
--- a/src/NzbDrone.Core/NzbDrone.Core.csproj
+++ b/src/NzbDrone.Core/NzbDrone.Core.csproj
@@ -201,6 +201,7 @@
+
@@ -1308,4 +1309,4 @@
-->
-
\ No newline at end of file
+