using System; using System.Collections.Generic; using System.Linq; using Marr.Data; using Marr.Data.Mapping; using NzbDrone.Common; using NzbDrone.Common.Serializer; using NzbDrone.Core.Configuration; using NzbDrone.Core.DataAugmentation.Scene; using NzbDrone.Core.Datastore.Converters; using NzbDrone.Core.ExternalNotification; using NzbDrone.Core.Indexers; using NzbDrone.Core.Instrumentation; using NzbDrone.Core.Jobs; using NzbDrone.Core.MediaFiles; using NzbDrone.Core.Organizer; using NzbDrone.Core.Qualities; using NzbDrone.Core.RootFolders; using NzbDrone.Core.SeriesStats; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Datastore { public static class TableMapping { private static readonly FluentMappings Mapper = new FluentMappings(true); public static void Map() { RegisterMappers(); Mapper.Entity().RegisterModel("Config"); Mapper.Entity().RegisterModel("RootFolders").Ignore(r => r.FreeSpace); Mapper.Entity().RegisterModel("IndexerDefinitions"); Mapper.Entity().RegisterModel("ScheduledTasks"); Mapper.Entity().RegisterModel("ExternalNotificationDefinitions"); Mapper.Entity().RegisterModel("SceneMappings"); Mapper.Entity().RegisterModel("History") .Relationships .AutoMapICollectionOrComplexProperties(); // .Relationship(); // .HasOne(h => h.Episode, h => h.EpisodeId) // .HasOne(h => h.Series, h => h.SeriesId); Mapper.Entity().RegisterModel("Series") .Ignore(s => s.Path) .Relationship() .HasOne(s => s.RootFolder, s => s.RootFolderId) .HasOne(s => s.QualityProfile, s => s.QualityProfileId); Mapper.Entity().RegisterModel("Seasons"); Mapper.Entity().RegisterModel("Episodes") .Ignore(e => e.SeriesTitle) .Relationship() .HasOne(episode => episode.EpisodeFile, episode => episode.EpisodeFileId); //.Relationships.AutoMapICollectionOrComplexProperties(); Mapper.Entity().RegisterModel("EpisodeFiles") .Relationships.AutoMapICollectionOrComplexProperties(); Mapper.Entity().RegisterModel("QualityProfiles"); Mapper.Entity().RegisterModel("QualitySizes"); Mapper.Entity().RegisterModel("Logs"); Mapper.Entity().RegisterModel("NamingConfig"); Mapper.Entity().MapResultSet(); } private static void RegisterMappers() { RegisterEmbeddedConverter(); MapRepository.Instance.RegisterTypeConverter(typeof(Int32), new Int32Converter()); MapRepository.Instance.RegisterTypeConverter(typeof(Boolean), new BooleanIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Enum), new EnumIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(Quality), new QualityIntConverter()); MapRepository.Instance.RegisterTypeConverter(typeof(DateTime), new UtcDateTimeConverter()); } private static void RegisterEmbeddedConverter() { var embeddedTypes = typeof(IEmbeddedDocument).Assembly.GetTypes() .Where(c => c.GetInterfaces().Any(i => i == typeof(IEmbeddedDocument))); var embeddedConvertor = new EmbeddedDocumentConverter(); var genericListDefinition = typeof(List<>).GetGenericTypeDefinition(); foreach (var embeddedType in embeddedTypes) { var embeddedListType = genericListDefinition.MakeGenericType(embeddedType); MapRepository.Instance.RegisterTypeConverter(embeddedType, embeddedConvertor); MapRepository.Instance.RegisterTypeConverter(embeddedListType, embeddedConvertor); } } } }