using System; using System.Collections.Generic; using System.Reflection; using Marr.Data; using Marr.Data.Mapping; using NzbDrone.Common.Reflection; using NzbDrone.Core.Tv; namespace NzbDrone.Core.Datastore { public static class MappingExtensions { public static ColumnMapBuilder MapResultSet(this FluentMappings.MappingsFluentEntity mapBuilder) where T : ResultSet, new() { return mapBuilder .Columns .AutoMapPropertiesWhere(IsMappableProperty); } public static ColumnMapBuilder RegisterModel(this FluentMappings.MappingsFluentEntity mapBuilder, string tableName = null) where T : ModelBase, new() { return mapBuilder.Table.MapTable(tableName) .Columns .AutoMapPropertiesWhere(IsMappableProperty) .PrefixAltNames(String.Format("{0}_", typeof(T).Name)) .For(c => c.Id) .SetPrimaryKey() .SetReturnValue() .SetAutoIncrement(); } public static RelationshipBuilder AutoMapChildModels(this ColumnMapBuilder mapBuilder) { return mapBuilder.Relationships.AutoMapPropertiesWhere(m => m.MemberType == MemberTypes.Property && typeof(ModelBase).IsAssignableFrom(((PropertyInfo) m).PropertyType)); } public static bool IsMappableProperty(MemberInfo memberInfo) { var propertyInfo = memberInfo as PropertyInfo; if (propertyInfo == null) return false; if (!propertyInfo.IsReadable() || !propertyInfo.IsWritable()) { return false; } if (propertyInfo.PropertyType.IsSimpleType() || MapRepository.Instance.TypeConverters.ContainsKey(propertyInfo.PropertyType)) { return true; } return false; } } }