public MigrationResult ExecuteMigration(string connectionString, string scriptFilePath) { // Generate C# DataContext using SqlMetal var sqlMetalConnectionStringArg = GetSqlMetalConnectionStringArg(connectionString); var generatedCSharpDataContext = new LinqToSQLDataContextGenerator().GenerateDataContext_AndGetCSharpCode(connectionString, sqlMetalConnectionStringArg, dbmlManipulator); // Get LinqPad Script var linqpadCreator = new LinqPadCSharpCreator(); var script = linqpadCreator.Parse(scriptFilePath); // Add namespace for DataContext script.Namespaces.Add(LinqToSQLDataContextGenerator.DataContextNamespace); // Convert LinqPad Script to Executable Source Code var executableScript = linqpadCreator.MakeScriptExecutable(script, generatedCSharpDataContext); Action <Exception> logExceptionWithSourceCode = (ex) => { string primarySourceCode = executableScript.SourceCodePieces.First(); logger.ErrorException(scriptFilePath, ex); logger.Error(primarySourceCode); }; // Create Compiler var csharpProvider = new CSharpCodeProvider(); IScriptCompiler compiler = new CodeDomScriptCompiler(csharpProvider); Assembly assembly = null; try { // Compile Script > .NET Assembly assembly = compiler.Compile(executableScript.AssemblyReferences, executableScript.SourceCodePieces); } catch (Exception ex) { var myException = new MigrationException(new MigrationResult(scriptFilePath, false, new[] { "Failed to compile script." }, ex)); logExceptionWithSourceCode(myException); throw myException; } IScriptExecutor executor = GetScriptExecutor(script); try { // Execute! var result = executor.Execute(assembly, scriptFilePath); return(result); } catch (MigrationException ex) { logExceptionWithSourceCode(ex); throw ex; } catch (Exception ex) { var myException = new MigrationException(new MigrationResult(scriptFilePath, false, new[] { "Failed to execute compiled script." }, ex)); logExceptionWithSourceCode(myException); throw myException; } }
public void should_generate_linq_datacontext_with_connection_string_as_default_constructor() { var generator = new LinqToSQLDataContextGenerator(); var connectionString = CopyNorthwindDatabaseAndGetConnectionString(); // Pull .SDF filename out of the connection string (required for SQL Compact) var extractedSQLCompactFilename = connectionString.Replace("Data Source", "").Replace("=", ""); var sqlMetalConnectionString = string.Format("\"{0}\"", extractedSQLCompactFilename); // Generate DataContext var generatedDataContext = generator.GenerateDataContext_AndGetCSharpCode(connectionString, sqlMetalConnectionString, null); // Connection String should now be embedded into DataContext default constructor var defaultConstructorSignature = "public TypedDataContext() : this(@\"" + connectionString + "\")"; Assert.IsTrue(generatedDataContext.Contains(defaultConstructorSignature)); }