Commit 10406949 authored by L. Ellenbeck's avatar L. Ellenbeck Committed by Marcel Nellesen
Browse files

New: migrations in a library coscine/issues#893

parent 190f2e80
## C# Template
## Migrator and Migrations
This template includes:
This project provides a library with the migrations based on Fluent Migrator and an executable to start the migrations.
* Automatic building using cake
* Automatic testing with NUnit
* Automatic linting with Resharper
* Automatic documentation publishing using Gitlab CI / CD and a self written script which puts the docs in the docs folder to the wiki
* Automatic releases using semantic-release ([ESLint Code Convention](docs/ESLintConvention)), cake and Gitlab CI / CD
The library (Migrations) can also be migrated by the official Fluent Migrator runner.
## What you need to do
Our custom executable (Migrator.exe) also allows for the creation of the needed database.
Place you C# project solution file in .src/.
Make sure Create directory for solution is unticked.
Start a migration by calling `Migrator.exe --migrate_up`.
This will create the needed database and run all migrations.
You can run the command again at a later time, to install additional migrations.
Migrations already deployed will not be deployed again.
![alt text](docs/images/create_project.png "Create a new Project")
You can revert a migration by calling `Migrator.exe --roll_back 1`.
This will remove the most recent migration.
Replacing the 1 with a 2 will revert the two most recent migrations and so on.
Delete unused docs and update this README.
The executable will create a connection string based on the Consul values:
* DbDataSourceKey: `coscine/global/db_data_source`
* DbNameKey: `coscine/global/db_name`
* DbUserIdKey: `coscine/global/db_user_id`
* DbPasswordKey: `coscine/global/db_password`
Add [NUnit](docs/nunit.md) tests to your solution.
## Building
You can call the migrations from a diffrent project.
The connection string information from Consul (except `db_name`) will be used.
Use the `CoscineMigrations` class for this:
Build this project by running either the build.ps1 or the build<span></span>.sh script.
The project will be build and tested.
```C#
// Setup the migrator class
var targetAssembly = typeof(CoscineMigrations).Assembly;
var migrator = new CoscineMigrations();
var dbDatabase = "YOUR_DATABASE_NAME_HERE";
migrator.SetServiceProvider(targetAssembly, migrator.GetDatabaseConnectionStringFromConsul(dbDatabase));
### Links
* [Commit convention](docs/ESLintConvention.md)
* [Everything possible with markup](docs/testdoc.md)
* [Adding NUnit tests](docs/nunit.md)
\ No newline at end of file
// Create the database if needed
migrator.EnsureDatabase(dbDatabase);
// Run the migrations on the database
migrator.MigrateUp();
```
\ No newline at end of file
## ESLint Convention
Make the changes to the code and tests and then commit to your branch. Be sure to follow the commit message conventions.
Commit message summaries must follow this basic format:
```
Tag: Message (fixes #1234)
```
`Tag` should not be confused with git tag.
`Message` should not be confused with git commit message.
The `Tag` is one of the following:
* `Fix` - for a bug fix.
* `Update` - for a backwards-compatible enhancement.
* `Breaking` - for a backwards-incompatible enhancement.
* `Docs` - changes to documentation only.
* `Build` - changes to build process only.
* `New` - implemented a new feature.
* `Upgrade` - for a dependency upgrade.
The message summary should be a one-sentence description of the change. The issue number should be mentioned at the end. * The commit message should say "(fixes #1234)" at the end of the description if it closes out an existing issue (replace 1234 with the issue number). If the commit doesn't completely fix the issue, then use `(refs #1234)` instead of `(fixes #1234)`.
Here are some good commit message summary examples:
```
Build: Update Travis to only test Node 0.10 (refs #734)
Fix: Semi rule incorrectly flagging extra semicolon (fixes #840)
Upgrade: Esprima to 1.2, switch to using Esprima comment attachment (fixes #730)
```
The commit message format is important because these messages are used to create a changelog for each release. The tag and issue number help to create more consistent and useful changelogs.
Based on https://github.com/eslint/eslint.github.io/blob/master/docs/developer-guide/contributing.md#step-2-make-your-changes
[npm-image]: https://badge.fury.io/js/conventional-changelog-eslint.svg
[npm-url]: https://npmjs.org/package/conventional-changelog-eslint
[travis-image]: https://travis-ci.org/stevemao/conventional-changelog-eslint.svg?branch=master
[travis-url]: https://travis-ci.org/stevemao/conventional-changelog-eslint
[daviddm-image]: https://david-dm.org/stevemao/conventional-changelog-eslint.svg?theme=shields.io
[daviddm-url]: https://david-dm.org/stevemao/conventional-changelog-eslint
[coveralls-image]: https://coveralls.io/repos/stevemao/conventional-changelog-eslint/badge.svg
[coveralls-url]: https://coveralls.io/r/stevemao/conventional-changelog-eslint
\ No newline at end of file
## C# Template
This template includes:
* Automatic building using cake
* Automatic testing with NUnit
* Automatic linting with Resharper
* Automatic documentation publishing using Gitlab CI / CD and a self written script which puts the docs in the docs folder to the wiki
* Automatic releases using semantic-release ([ESLint Code Convention](ESLintConvention)), cake and Gitlab CI / CD
## What you need to do
Place you C# project solution file in .src/.
Make sure Create directory for solution is unticked.
![alt text](images/create_project.png "Create a new Project")
Delete unused docs and update this README.
Add [NUnit](nunit) tests to your solution.
## Building
Build this project by running either the build.ps1 or the build<span></span>.sh script.
The project will be build and tested.
### Links
* [Commit convention](ESLintConvention)
* [Everything possible with markup](testdoc)
* [Adding NUnit tests](nunit)
## Add NUnit Tests
### Add Nunit test adapter
1. Choose **Tools > Extensions and Updates**
2. In the **Extensions and Updates** dialog box, expand the **Online** category and then **Visual Studio Marketplace**. Then, choose **Tools > Testing**.
2. Select the **NUnit test adapter** and then choose **Download.**
### Add Tests
1. Create a class library project and add it to your solution.
For convinience name it like your main project and add **.Tests** as a suffix.
![alt text](images/create_class_library.png "Select Class Library")
2. Install the plug-in. In **Solution Explorer**, select the class library project, and then choose **Manage NuGet Packages** from its right-click or context menu.
![alt text](images/add_a_package.png "Add a package")
3. In the **NuGet Package Manager** window, search for and select the plug-in (NUnit), and then choose **Install**.
![alt text](images/select_framework.png "Select Project")
The framework is now referenced in your project under **References**.
4. From the class library project's **References** node, select **Add Reference**.
![alt text](images/add_a_reference.png "Add a reference")
5. In the **Reference Manager** dialog box, select the project that contains the code you'll test.
![alt text](images/select_project.png "Select Project")
6. Code your unit test.
![alt text](images/test_code.png "Test Code")
It's very easy to make some words **bold** and other words *italic* with Markdown. You can even [link to Google!](http://google.com)
Sometimes you want numbered lists:
1. One
2. Two
3. Three
Sometimes you want bullet points:
* Start a line with a star
* Profit!
Alternatively,
- Dashes work just as well
- And if you have sub points, put two spaces before the dash or star:
- Like this
- And this
If you want to embed images, this is how you do it:
![Image of Yaktocat](https://octodex.github.com/images/yaktocat.png)
# Structured documents
Sometimes it's useful to have different levels of headings to structure your documents. Start lines with a `#` to create headings. Multiple `##` in a row denote smaller heading sizes.
### This is a third-tier heading
You can use one `#` all the way up to `######` six for different heading sizes.
If you'd like to quote someone, use the > character before the line:
> Coffee. The finest organic suspension ever devised... I beat the Borg with it.
> - Captain Janeway
[200~There are many different ways to style code with GitHub's markdown. If you have inline code blocks, wrap them in backticks: `var example = true`. If you've got a longer block of code, you can indent with four spaces:
if (isAwesome){
return true
}
GitHub also supports something called code fencing, which allows for multiple lines without indentation:
```
if (isAwesome){
return true
}
```
And if you'd like to use syntax highlighting, include the language:
```javascript
if (isAwesome){
return true
}
```
GitHub supports many extras in Markdown that help you reference and link to people. If you ever want to direct a comment at someone, you can prefix their name with an @ symbol: Hey @kneath — love your sweater!
But I have to admit, tasks lists are my favorite:
- [x] This is a complete item
- [ ] This is an incomplete item
When you include a task list in the first comment of an Issue, you will see a helpful progress bar in your list of issues. It works in Pull Requests, too!
And, of course emoji!
GitHub supports many extras in Markdown that help you reference and link to people. If you ever want to direct a comment at someone, you can prefix their name with an @ symbol: Hey @kneath — love your sweater!
But I have to admit, tasks lists are my favorite:
This is a complete item
This is an incomplete item
When you include a task list in the first comment of an Issue, you will see a helpful progress bar in your list of issues. It works in Pull Requests, too!
And, of course emoji!
......@@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.28803.156
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Migrator", "Migrator\Migrator.csproj", "{A48A255E-D08A-4336-B481-266DEBFABDE9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Migrations", "Migrations\Migrations.csproj", "{447E8BA5-30E3-4521-B6F6-51A064098026}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -15,6 +17,10 @@ Global
{A48A255E-D08A-4336-B481-266DEBFABDE9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A48A255E-D08A-4336-B481-266DEBFABDE9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A48A255E-D08A-4336-B481-266DEBFABDE9}.Release|Any CPU.Build.0 = Release|Any CPU
{447E8BA5-30E3-4521-B6F6-51A064098026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{447E8BA5-30E3-4521-B6F6-51A064098026}.Debug|Any CPU.Build.0 = Debug|Any CPU
{447E8BA5-30E3-4521-B6F6-51A064098026}.Release|Any CPU.ActiveCfg = Release|Any CPU
{447E8BA5-30E3-4521-B6F6-51A064098026}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
using Coscine.Configuration;
using FluentMigrator.Runner;
using Microsoft.Extensions.DependencyInjection;
using System.Data.SqlClient;
namespace Coscine.Database.Migration
namespace Coscine.Migrations
{
public class Migrator
public class CoscineMigrations
{
// Format: Data Source={DBSERVER};Database={DATABASENAME};User Id={USER};Password={PASSWORD};
private const string DbDataSourceKey = "coscine/global/db_data_source";
......@@ -15,13 +16,21 @@ namespace Coscine.Database.Migration
private readonly IConfiguration _configuration;
private ServiceProvider _serviceProvider;
public Migrator(System.Reflection.Assembly targetAssembly)
public string ConnectionString { get; set; }
public CoscineMigrations()
{
_configuration = new ConsulConfiguration();
SetServiceProvider(targetAssembly, GetDbConnectionString());
ConnectionString = GetServerConnectionStringFromConsul();
}
private void SetServiceProvider(System.Reflection.Assembly targetAssembly, string dbConnectionString)
public CoscineMigrations(IConfiguration configuration)
{
_configuration = configuration;
ConnectionString = GetServerConnectionStringFromConsul();
}
public void SetServiceProvider(System.Reflection.Assembly targetAssembly, string dbConnectionString)
{
var serviceProvider = new ServiceCollection()
// Registration of all FluentMigrator-specific services
......@@ -45,13 +54,84 @@ namespace Coscine.Database.Migration
_serviceProvider = serviceProvider;
}
public string GetDbConnectionString()
public void CreateDatabse(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"CREATE DATABASE {sqlCommandBuilder.QuoteIdentifier(dbDatabase)};";
command.ExecuteNonQuery();
}
}
public void DropDatabase(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"DROP DATABASE {sqlCommandBuilder.QuoteIdentifier(dbDatabase)};";
command.ExecuteNonQuery();
}
}
public bool DatabaseExists(string dbDatabase)
{
var sqlCommandBuilder = new SqlCommandBuilder();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"SELECT DB_ID('{sqlCommandBuilder.QuoteIdentifier(dbDatabase)}') AS RESULT;";
using (var reader = command.ExecuteReader())
{
if (reader.Read())
{
var result = reader["result"].ToString();
return !string.IsNullOrWhiteSpace(result);
}
}
return false;
}
}
public void EnsureDatabase(string dbDatabase)
{
if (!DatabaseExists(dbDatabase))
{
CreateDatabse(dbDatabase);
}
}
public string GetDatabaseConnectionStringFromConsul()
{
var dbDataSource = _configuration.GetString(DbDataSourceKey);
var dbDatabase = _configuration.GetString(DbNameKey);
return GetDatabaseConnectionStringFromConsul(dbDatabase);
}
public string GetDatabaseConnectionStringFromConsul(string dbDatabase)
{
var dbDataSource = _configuration.GetString(DbDataSourceKey);
var dbUserId = _configuration.GetString(DbUserIdKey);
var dbPassword = _configuration.GetString(DbPasswordKey);
return $"Data Source={dbDataSource};Database={dbDatabase};User Id={dbUserId};Password={dbPassword};";
}
public string GetServerConnectionStringFromConsul()
{
var dbDataSource = _configuration.GetString(DbDataSourceKey);
var dbUserId = _configuration.GetString(DbUserIdKey);
var dbPassword = _configuration.GetString(DbPasswordKey);
return $"Data Source={dbDataSource}; Database={dbDatabase}; User Id={dbUserId}; Password={dbPassword};";
return $"Data Source={dbDataSource};User Id={dbUserId};Password={dbPassword};";
}
public string GetConsulDatabaseName()
{
return _configuration.GetString(DbNameKey);
}
public void MigrateUp()
......@@ -78,7 +158,7 @@ namespace Coscine.Database.Migration
}
// Currently not in use
internal void MigrateDown(FluentMigrator.IMigration targetMigration)
public void MigrateDown(FluentMigrator.IMigration targetMigration)
{
using (var scope = _serviceProvider.CreateScope())
{
......@@ -86,5 +166,6 @@ namespace Coscine.Database.Migration
runner.Down(targetMigration);
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{447E8BA5-30E3-4521-B6F6-51A064098026}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Coscine.Migrations</RootNamespace>
<AssemblyName>Migrations</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
<HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
</Reference>
<Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
<HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.3.2.8\lib\net461\FluentMigrator.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Abstractions, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Abstractions.3.2.8\lib\net461\FluentMigrator.Abstractions.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Extensions.Oracle, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Extensions.Oracle.3.2.8\lib\net461\FluentMigrator.Extensions.Oracle.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Extensions.Postgres, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Extensions.Postgres.3.2.8\lib\net461\FluentMigrator.Extensions.Postgres.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Extensions.SqlAnywhere, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Extensions.SqlAnywhere.3.2.8\lib\net461\FluentMigrator.Extensions.SqlAnywhere.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Extensions.SqlServer, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Extensions.SqlServer.3.2.8\lib\net461\FluentMigrator.Extensions.SqlServer.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.3.2.8\lib\net461\FluentMigrator.Runner.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Core, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Core.3.2.8\lib\net461\FluentMigrator.Runner.Core.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Db2, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Db2.3.2.8\lib\net461\FluentMigrator.Runner.Db2.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Firebird, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Firebird.3.2.8\lib\net461\FluentMigrator.Runner.Firebird.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Hana, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Hana.3.2.8\lib\net461\FluentMigrator.Runner.Hana.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Jet, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Jet.3.2.8\lib\net461\FluentMigrator.Runner.Jet.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.MySql, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.MySql.3.2.8\lib\net461\FluentMigrator.Runner.MySql.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Oracle, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Oracle.3.2.8\lib\net461\FluentMigrator.Runner.Oracle.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Postgres, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Postgres.3.2.8\lib\net461\FluentMigrator.Runner.Postgres.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.Redshift, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.Redshift.3.2.8\lib\net461\FluentMigrator.Runner.Redshift.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.SqlAnywhere, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.SqlAnywhere.3.2.8\lib\net461\FluentMigrator.Runner.SqlAnywhere.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.SQLite, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.SQLite.3.2.8\lib\net461\FluentMigrator.Runner.SQLite.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.SqlServer, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.SqlServer.3.2.8\lib\net461\FluentMigrator.Runner.SqlServer.dll</HintPath>
</Reference>
<Reference Include="FluentMigrator.Runner.SqlServerCe, Version=3.2.8.0, Culture=neutral, PublicKeyToken=aacfc7de5acabf05, processorArchitecture=MSIL">
<HintPath>..\packages\FluentMigrator.Runner.SqlServerCe.3.2.8\lib\net461\FluentMigrator.Runner.SqlServerCe.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Data.Sqlite, Version=3.1.5.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Data.Sqlite.Core.3.1.5\lib\netstandard2.0\Microsoft.Data.Sqlite.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Configuration.Abstractions, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Configuration.Abstractions.2.0.1\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.2.0.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.2.0.0\lib\netstandard2.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.2.0.1\lib\netstandard2.0\Microsoft.Extensions.Logging.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Logging.Abstractions.2.0.1\lib\netstandard2.0\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Options, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Options.2.0.1\lib\netstandard2.0\Microsoft.Extensions.Options.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Extensions.Primitives, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Extensions.Primitives.2.0.0\lib\netstandard2.0\Microsoft.Extensions.Primitives.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.batteries_v2, Version=2.0.2.669, Culture=neutral, PublicKeyToken=8226ea5df37bcae9, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.bundle_e_sqlite3.2.0.2\lib\net461\SQLitePCLRaw.batteries_v2.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.core, Version=2.0.2.669, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.core.2.0.2\lib\netstandard2.0\SQLitePCLRaw.core.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.nativelibrary, Version=2.0.2.669, Culture=neutral, PublicKeyToken=502ed628492ab262, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.bundle_e_sqlite3.2.0.2\lib\net461\SQLitePCLRaw.nativelibrary.dll</HintPath>
</Reference>
<Reference Include="SQLitePCLRaw.provider.dynamic_cdecl, Version=2.0.2.669, Culture=neutral, PublicKeyToken=b68184102cba0b3b, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.provider.dynamic_cdecl.2.0.2\lib\netstandard2.0\SQLitePCLRaw.provider.dynamic_cdecl.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.4.4.1\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Net.Http.WebRequest" />
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.2.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.4.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MigrationsHelpers.cs" />
<Compile Include="Migrations\Migration201907011352ProjectApi.cs" />
<Compile Include="Migrations\Migration201907081510EnhanceProjectApi.cs" />
<Compile Include="Migrations\Migration201907100900UserProfilesApi.cs" />
<Compile Include="Migrations\Migration201908071616RdsResource.cs" />
<Compile Include="Migrations\Migration201908121401GitlabResource.cs" />
<Compile Include="Migrations\Migration201908231520ResourceDisplayName.cs" />
<Compile Include="Migrations\Migration201908290941ORCiD.cs" />
<Compile Include="Migrations\Migration201909111125ProjectEnhancement.cs" />
<Compile Include="Migrations\Migration201909160919UserEnhancement.cs" />
<Compile Include="Migrations\Migration201909190938ResourceEnhancement.cs" />
<Compile Include="Migrations\Migration201910021300ResourceDescription.cs" />
<Compile Include="Migrations\Migration201910161154InstitutesDisciplines.cs" />
<Compile Include="Migrations\Migration201910241600ResourceMetadata.cs" />
<Compile Include="Migrations\Migration201911040900EnglishDFG.cs" />