public void Throws_for_no_parameterless_constructor() { using (var directory = new TempDirectory()) { var targetDir = directory.Path; var source = new BuildSource { TargetDir = targetDir, References = { BuildReference.ByName("System.Diagnostics.DiagnosticSource", copyLocal: true), BuildReference.ByName("System.Interactive.Async", copyLocal: true), BuildReference.ByName("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"), BuildReference.ByName("Microsoft.AspNetCore.Hosting.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore.Tools", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore.Tools.Core", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore.Relational", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore.Relational.Design", copyLocal: true), BuildReference.ByName("Microsoft.EntityFrameworkCore.SqlServer", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Caching.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Caching.Memory", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Configuration.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.DependencyInjection", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.DependencyInjection.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.FileProviders.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Logging", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Logging.Abstractions", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.Options", copyLocal: true), BuildReference.ByName("Microsoft.Extensions.PlatformAbstractions", copyLocal: true), BuildReference.ByName("Remotion.Linq", copyLocal: true) }, Sources = { @" using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; namespace MyProject { internal class MyContext : DbContext { public MyContext(DbContextOptions<MyContext> options) :base(options) {} } }" } }; var build = source.Build(); using (var executor = new AppDomainOperationExecutor(targetDir, build.TargetName, targetDir, targetDir, "MyProject")) { var ex = Assert.Throws <OperationException>( () => executor.GetMigrations("MyContext")); Assert.Equal( ToolsCoreStrings.NoParameterlessConstructor("MyContext"), ex.Message); } } }
private IDictionary <Type, Func <DbContext> > FindContextTypes() { _logger.Value.LogDebug(ToolsCoreStrings.LogFindingContexts); var contexts = new Dictionary <Type, Func <DbContext> >(); // Look for IDbContextFactory implementations var contextFactories = _startupAssembly.GetConstructibleTypes() .Where(t => typeof(IDbContextFactory <DbContext>).GetTypeInfo().IsAssignableFrom(t)); foreach (var factory in contextFactories) { var manufacturedContexts = from i in factory.ImplementedInterfaces where i.GetTypeInfo().IsGenericType && i.GetGenericTypeDefinition() == typeof(IDbContextFactory <>) select i.GenericTypeArguments[0]; foreach (var context in manufacturedContexts) { contexts.Add( context, () => ((IDbContextFactory <DbContext>)Activator.CreateInstance(factory.AsType())).Create()); } } // Look for DbContext classes registered in the service provider var registeredContexts = _runtimeServices.GetServices <DbContextOptions>() .Select(o => o.ContextType); foreach (var context in registeredContexts.Where(c => !contexts.ContainsKey(c))) { contexts.Add( context, FindContextFactory(context) ?? (() => (DbContext)_runtimeServices.GetRequiredService(context))); } // Look for DbContext classes in assemblies var types = _startupAssembly.GetConstructibleTypes() .Concat(_assembly.GetConstructibleTypes()) .Select(i => i.AsType()); var contextTypes = types.Where(t => typeof(DbContext).IsAssignableFrom(t)) .Concat( types.Where(t => typeof(Migration).IsAssignableFrom(t)) .Select(t => t.GetTypeInfo().GetCustomAttribute <DbContextAttribute>()?.ContextType) .Where(t => t != null)) .Distinct(); foreach (var context in contextTypes.Where(c => !contexts.ContainsKey(c))) { contexts.Add( context, FindContextFactory(context) ?? (Func <DbContext>)(() => { try { return((DbContext)Activator.CreateInstance(context)); } catch (MissingMethodException ex) { throw new OperationException(ToolsCoreStrings.NoParameterlessConstructor(context.Name), ex); } })); } return(contexts); }