public async Task <ModelMetadata> GetModelMetadata(string dbContextTypeName, ITypeSymbol modelTypeSymbol) { Type dbContextType; var dbContextSymbols = _modelTypesLocator.GetType(dbContextTypeName).ToList(); var isNewDbContext = false; SyntaxTree newDbContextTree = null; NewDbContextTemplateModel dbContextTemplateModel = null; if (dbContextSymbols.Count == 0) { isNewDbContext = true; dbContextTemplateModel = new NewDbContextTemplateModel(dbContextTypeName, modelTypeSymbol); newDbContextTree = await _dbContextEditorServices.AddNewContext(dbContextTemplateModel); var projectCompilation = _libraryManager.GetProject(_environment).Compilation; var newAssemblyName = projectCompilation.AssemblyName + _counter++; var newCompilation = projectCompilation.AddSyntaxTrees(newDbContextTree).WithAssemblyName(newAssemblyName); var result = CommonUtilities.GetAssemblyFromCompilation(_loader, newCompilation); if (result.Success) { dbContextType = result.Assembly.GetType(dbContextTypeName); if (dbContextType == null) { throw new InvalidOperationException("There was an error creating a DbContext, there was no type returned after compiling the new assembly successfully"); } } else { throw new InvalidOperationException("There was an error creating a DbContext :" + string.Join("\n", result.ErrorMessages)); } } else { dbContextType = _libraryManager.GetReflectionType(_environment, dbContextTypeName); if (dbContextType == null) { throw new InvalidOperationException("Could not get the reflection type for DbContext : " + dbContextTypeName); } } var modelTypeName = modelTypeSymbol.FullNameForSymbol(); var modelType = _libraryManager.GetReflectionType(_environment, modelTypeName); if (modelType == null) { throw new InvalidOperationException("Could not get the reflection type for Model : " + modelTypeName); } var metadata = GetModelMetadata(dbContextType, modelType); // Write the DbContext if getting the model metadata is successful if (isNewDbContext) { await WriteDbContext(dbContextTemplateModel, newDbContextTree); } return(metadata); }