Skip to content

Instantly share code, notes, and snippets.

@ksysiekj
Created August 17, 2017 15:24
Show Gist options
  • Save ksysiekj/e2ec66d094655de919be0c26729e7e6b to your computer and use it in GitHub Desktop.
Save ksysiekj/e2ec66d094655de919be0c26729e7e6b to your computer and use it in GitHub Desktop.
static class ModelBuilderExtensions
{
private static readonly Assembly EntitiesAssembly = typeof(AdventureWorksDbContext).Assembly;
private static readonly Type EntityActiveableType = typeof(IEntityActiveable);
private static readonly MethodInfo EntityMethod = typeof(ModelBuilder).GetTypeInfo().GetMethods().Single(x => x.Name == "Entity" && x.IsGenericMethod && x.GetParameters().Length == 0);
private static IList<Type> _activeablesTypes;
private static IList<Type> ActiveablesTypes
{
get { return _activeablesTypes ?? (_activeablesTypes = EntitiesAssembly.ExportedTypes.Where(t => t.IsClass && t.IsPublic && EntityActiveableType.IsAssignableFrom(t)).ToList()); }
}
internal static void SetActiveableQueryFilters(this ModelBuilder modelBuilder)
{
foreach (Type type in ActiveablesTypes)
{
dynamic entityTypeBuilder = EntityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[0]);
SetActiveableQueryFilter(entityTypeBuilder);
}
}
private static void SetActiveableQueryFilter<T>(this EntityTypeBuilder<T> entityTypeBuilder)
where T : class, IEntityActiveable
{
entityTypeBuilder.HasQueryFilter(q => q.IsActive);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment