diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..10061b4
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,19 @@
+language: csharp
+sudo: required
+dist: trusty
+mono: none
+dotnet: 1.0.0
+
+install:
+ - export DOTNET_CLI_TELEMETRY_OPTOUT=1
+ - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then rvm get stable; brew update; brew install openssl; fi
+os:
+ - linux
+ - osx
+osx_image: xcode7.3
+before_script:
+ - chmod a+x ./build.sh
+script:
+ - ./build.sh
+notifications:
+ email: false
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..b4aebfe
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,23 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/)
+and this project adheres to [Semantic Versioning](http://semver.org/).
+
+## [Unreleased]
+_Nothing yet..._
+
+## [0.7.0] - 2017-06-08
+### Changed
+- SqlServer: Set migration history's table name and schema.
+
+### Fixed
+- Services not being disposed correctly after a job execution. [#4](https://github.com/mrahhal/MR.AspNetCore.Jobs/issues/4)
+
+## [0.6.0] - 2017-04-22
+### Changed
+- SqlServer: Move to using EFCore to manage internal migrations and connections to the database.
+
+[Unreleased]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.7.0...HEAD
+[0.7.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.6.0...0.7.0
+[0.6.0]: https://github.com/mrahhal/MR.AspNetCore.Jobs/compare/0.5.0...0.6.0
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..72b4040
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,22 @@
+version: '{build}'
+os: Visual Studio 2015
+environment:
+ BUILDING_ON_PLATFORM: win
+ BuildEnvironment: appveyor
+ Jobs_SqlServer_ConnectionStringTemplate: Server=.\SQL2012SP1;Database={0};User ID=sa;Password=Password12!
+services:
+ - mssql2012sp1
+build_script:
+- ps: ./ConfigureMSDTC.ps1
+- ps: ./build.ps1
+test: off
+artifacts:
+- path: artifacts/packages/*.nupkg
+deploy:
+ provider: NuGet
+ on:
+ appveyor_repo_tag: true
+ api_key:
+ secure: PWCeOQ12fgAhPiBjgkBAqHbvaPQArarsO2sI+8KCeXjBjE+AHaMIMW8b7efmDzQ6
+ skip_symbols: true
+ artifact: /artifacts\/packages\/.+\.nupkg/
diff --git a/build.cake b/build.cake
new file mode 100644
index 0000000..02b52c4
--- /dev/null
+++ b/build.cake
@@ -0,0 +1,100 @@
+#addin "nuget:https://www.nuget.org/api/v2?package=Newtonsoft.Json&version=9.0.1"
+
+#load "./build/index.cake"
+
+var target = Argument("target", "Default");
+
+var build = BuildParameters.Create(Context);
+var util = new Util(Context, build);
+
+Task("Clean")
+ .Does(() =>
+{
+ if (DirectoryExists("./artifacts"))
+ {
+ DeleteDirectory("./artifacts", true);
+ }
+});
+
+Task("Restore")
+ .IsDependentOn("Clean")
+ .Does(() =>
+{
+ var settings = new DotNetCoreRestoreSettings
+ {
+ ArgumentCustomization = args =>
+ {
+ args.Append($"/p:VersionSuffix={build.Version.Suffix}");
+ return args;
+ }
+ };
+ DotNetCoreRestore(settings);
+});
+
+Task("Build")
+ .IsDependentOn("Restore")
+ .Does(() =>
+{
+ var settings = new DotNetCoreBuildSettings
+ {
+ Configuration = build.Configuration,
+ VersionSuffix = build.Version.Suffix,
+ ArgumentCustomization = args =>
+ {
+ args.Append($"/p:InformationalVersion={build.Version.VersionWithSuffix()}");
+ return args;
+ }
+ };
+ foreach (var project in build.ProjectFiles)
+ {
+ DotNetCoreBuild(project.FullPath, settings);
+ }
+});
+
+Task("Test")
+ .IsDependentOn("Build")
+ .Does(() =>
+{
+ foreach (var testProject in build.TestProjectFiles)
+ {
+ DotNetCoreTest(testProject.FullPath);
+ }
+});
+
+Task("Pack")
+ .Does(() =>
+{
+ var settings = new DotNetCorePackSettings
+ {
+ Configuration = build.Configuration,
+ VersionSuffix = build.Version.Suffix,
+ OutputDirectory = "./artifacts/packages"
+ };
+ foreach (var project in build.ProjectFiles)
+ {
+ DotNetCorePack(project.FullPath, settings);
+ }
+});
+
+Task("Default")
+ .IsDependentOn("Build")
+ .IsDependentOn("Test")
+ .IsDependentOn("Pack")
+ .Does(() =>
+{
+ util.PrintInfo();
+});
+
+Task("Version")
+ .Does(() =>
+{
+ Information($"{build.FullVersion()}");
+});
+
+Task("Print")
+ .Does(() =>
+{
+ util.PrintInfo();
+});
+
+RunTarget(target);
diff --git a/build.ps1 b/build.ps1
new file mode 100644
index 0000000..7526d9f
--- /dev/null
+++ b/build.ps1
@@ -0,0 +1,183 @@
+<#
+
+.SYNOPSIS
+This is a Powershell script to bootstrap a Cake build.
+
+.DESCRIPTION
+This Powershell script will download NuGet if missing, restore NuGet tools (including Cake)
+and execute your Cake build script with the parameters you provide.
+
+.PARAMETER Script
+The build script to execute.
+.PARAMETER Target
+The build script target to run.
+.PARAMETER Configuration
+The build configuration to use.
+.PARAMETER Verbosity
+Specifies the amount of information to be displayed.
+.PARAMETER Experimental
+Tells Cake to use the latest Roslyn release.
+.PARAMETER WhatIf
+Performs a dry run of the build script.
+No tasks will be executed.
+.PARAMETER Mono
+Tells Cake to use the Mono scripting engine.
+.PARAMETER SkipToolPackageRestore
+Skips restoring of packages.
+.PARAMETER ScriptArgs
+Remaining arguments are added here.
+
+.LINK
+http://cakebuild.net
+
+#>
+
+[CmdletBinding()]
+Param(
+ [string]$Script = "build.cake",
+ [string]$Target = "Default",
+ [ValidateSet("Release", "Debug")]
+ [string]$Configuration = "Debug",
+ [ValidateSet("Quiet", "Minimal", "Normal", "Verbose", "Diagnostic")]
+ [string]$Verbosity = "Normal",
+ [switch]$Experimental = $true,
+ [Alias("DryRun","Noop")]
+ [switch]$WhatIf,
+ [switch]$Mono,
+ [switch]$SkipToolPackageRestore,
+ [Parameter(Position=0,Mandatory=$false,ValueFromRemainingArguments=$true)]
+ [string[]]$ScriptArgs
+)
+
+[Reflection.Assembly]::LoadWithPartialName("System.Security") | Out-Null
+function MD5HashFile([string] $filePath)
+{
+ if ([string]::IsNullOrEmpty($filePath) -or !(Test-Path $filePath -PathType Leaf))
+ {
+ return $null
+ }
+
+ [System.IO.Stream] $file = $null;
+ [System.Security.Cryptography.MD5] $md5 = $null;
+ try
+ {
+ $md5 = [System.Security.Cryptography.MD5]::Create()
+ $file = [System.IO.File]::OpenRead($filePath)
+ return [System.BitConverter]::ToString($md5.ComputeHash($file))
+ }
+ finally
+ {
+ if ($file -ne $null)
+ {
+ $file.Dispose()
+ }
+ }
+}
+
+Write-Host "Preparing to run build script..."
+
+if(!$PSScriptRoot){
+ $PSScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent
+}
+
+$TOOLS_DIR = Join-Path $PSScriptRoot "tools"
+$NUGET_EXE = Join-Path $TOOLS_DIR "nuget.exe"
+$CAKE_EXE = Join-Path $TOOLS_DIR "Cake/Cake.exe"
+$NUGET_URL = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
+$PACKAGES_CONFIG = Join-Path $TOOLS_DIR "packages.config"
+$PACKAGES_CONFIG_MD5 = Join-Path $TOOLS_DIR "packages.config.md5sum"
+
+# Should we use mono?
+$UseMono = "";
+if($Mono.IsPresent) {
+ Write-Verbose -Message "Using the Mono based scripting engine."
+ $UseMono = "-mono"
+}
+
+# Should we use the new Roslyn?
+$UseExperimental = "";
+if($Experimental.IsPresent -and !($Mono.IsPresent)) {
+ Write-Verbose -Message "Using experimental version of Roslyn."
+ $UseExperimental = "-experimental"
+}
+
+# Is this a dry run?
+$UseDryRun = "";
+if($WhatIf.IsPresent) {
+ $UseDryRun = "-dryrun"
+}
+
+# Make sure tools folder exists
+if ((Test-Path $PSScriptRoot) -and !(Test-Path $TOOLS_DIR)) {
+ Write-Verbose -Message "Creating tools directory..."
+ New-Item -Path $TOOLS_DIR -Type directory | out-null
+}
+
+# Make sure that packages.config exist.
+if (!(Test-Path $PACKAGES_CONFIG)) {
+ Write-Verbose -Message "Downloading packages.config..."
+ try { (New-Object System.Net.WebClient).DownloadFile("http://cakebuild.net/download/bootstrapper/packages", $PACKAGES_CONFIG) } catch {
+ Throw "Could not download packages.config."
+ }
+}
+
+# Try find NuGet.exe in path if not exists
+if (!(Test-Path $NUGET_EXE)) {
+ Write-Verbose -Message "Trying to find nuget.exe in PATH..."
+ $existingPaths = $Env:Path -Split ';' | Where-Object { (![string]::IsNullOrEmpty($_)) -and (Test-Path $_) }
+ $NUGET_EXE_IN_PATH = Get-ChildItem -Path $existingPaths -Filter "nuget.exe" | Select -First 1
+ if ($NUGET_EXE_IN_PATH -ne $null -and (Test-Path $NUGET_EXE_IN_PATH.FullName)) {
+ Write-Verbose -Message "Found in PATH at $($NUGET_EXE_IN_PATH.FullName)."
+ $NUGET_EXE = $NUGET_EXE_IN_PATH.FullName
+ }
+}
+
+# Try download NuGet.exe if not exists
+if (!(Test-Path $NUGET_EXE)) {
+ Write-Verbose -Message "Downloading NuGet.exe..."
+ try {
+ (New-Object System.Net.WebClient).DownloadFile($NUGET_URL, $NUGET_EXE)
+ } catch {
+ Throw "Could not download NuGet.exe."
+ }
+}
+
+# Save nuget.exe path to environment to be available to child processed
+$ENV:NUGET_EXE = $NUGET_EXE
+
+# Restore tools from NuGet?
+if(-Not $SkipToolPackageRestore.IsPresent) {
+ Push-Location
+ Set-Location $TOOLS_DIR
+
+ # Check for changes in packages.config and remove installed tools if true.
+ [string] $md5Hash = MD5HashFile($PACKAGES_CONFIG)
+ if((!(Test-Path $PACKAGES_CONFIG_MD5)) -Or
+ ($md5Hash -ne (Get-Content $PACKAGES_CONFIG_MD5 ))) {
+ Write-Verbose -Message "Missing or changed package.config hash..."
+ Remove-Item * -Recurse -Exclude packages.config,nuget.exe
+ }
+
+ Write-Verbose -Message "Restoring tools from NuGet..."
+ $NuGetOutput = Invoke-Expression "&`"$NUGET_EXE`" install -ExcludeVersion -OutputDirectory `"$TOOLS_DIR`""
+
+ if ($LASTEXITCODE -ne 0) {
+ Throw "An error occured while restoring NuGet tools."
+ }
+ else
+ {
+ $md5Hash | Out-File $PACKAGES_CONFIG_MD5 -Encoding "ASCII"
+ }
+ Write-Verbose -Message ($NuGetOutput | out-string)
+ Pop-Location
+}
+
+# Make sure that Cake has been installed.
+if (!(Test-Path $CAKE_EXE)) {
+ Throw "Could not find Cake.exe at $CAKE_EXE"
+}
+
+# Start Cake
+Write-Host "Running build script..."
+Invoke-Expression "& `"$CAKE_EXE`" `"$Script`" -target=`"$Target`" -configuration=`"$Configuration`" -verbosity=`"$Verbosity`" $UseMono $UseDryRun $UseExperimental $ScriptArgs"
+exit $LASTEXITCODE
diff --git a/build.sh b/build.sh
new file mode 100644
index 0000000..15f08bf
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,4 @@
+dotnet --info
+dotnet restore
+dotnet test test/Cap.Consistency.EntityFrameworkCore.Test/Cap.Consistency.EntityFrameworkCore.Test.csproj -f netcoreapp1.1
+dotnet test test/Cap.Consistency.Test/Cap.Consistency.Test.csproj -f netcoreapp1.1
\ No newline at end of file
diff --git a/build/common.props b/build/common.props
new file mode 100644
index 0000000..9d6bc4b
--- /dev/null
+++ b/build/common.props
@@ -0,0 +1,16 @@
+
+
+
+
+
+ netstandard1.6
+
+
+
+ Cap
+ Savorboard
+ https://github.com/ouraspnet/cap
+ https://github.com/ouraspnet/cap/blob/master/LICENSE
+
+
+
diff --git a/build/index.cake b/build/index.cake
new file mode 100644
index 0000000..f0684bf
--- /dev/null
+++ b/build/index.cake
@@ -0,0 +1,2 @@
+#load "./util.cake"
+#load "./version.cake"
diff --git a/build/util.cake b/build/util.cake
new file mode 100644
index 0000000..4a18e87
--- /dev/null
+++ b/build/util.cake
@@ -0,0 +1,25 @@
+public class Util
+{
+ public Util(ICakeContext context, BuildParameters build)
+ {
+ Context = context;
+ Build = build;
+ }
+
+ public ICakeContext Context { get; set; }
+ public BuildParameters Build { get; set; }
+
+ public void PrintInfo()
+ {
+ Context.Information($@"
+Version: {Build.FullVersion()}
+Configuration: {Build.Configuration}
+");
+ }
+
+ public static string CreateStamp()
+ {
+ var seconds = (long)(DateTime.UtcNow - new DateTime(2017, 1, 1)).TotalSeconds;
+ return seconds.ToString().PadLeft(11, (char)'0');
+ }
+}
diff --git a/build/version.cake b/build/version.cake
new file mode 100644
index 0000000..f0db1ac
--- /dev/null
+++ b/build/version.cake
@@ -0,0 +1,120 @@
+using System.Xml;
+
+public class BuildParameters
+{
+ public BuildParameters(ICakeContext context)
+ {
+ Context = context;
+ }
+
+ public ICakeContext Context { get; }
+ public BuildVersion Version { get; private set; }
+ public string Configuration { get; private set; }
+ public bool IsTagged { get; private set; }
+ public bool IsCI { get; private set; }
+ public DirectoryPathCollection Projects { get; set; }
+ public DirectoryPathCollection TestProjects { get; set; }
+ public FilePathCollection ProjectFiles { get; set; }
+ public FilePathCollection TestProjectFiles { get; set; }
+
+ public static BuildParameters Create(ICakeContext context)
+ {
+ var buildParameters = new BuildParameters(context);
+ buildParameters.Initialize();
+ return buildParameters;
+ }
+
+ public string FullVersion()
+ {
+ return Version.VersionWithSuffix();
+ }
+
+ private void Initialize()
+ {
+ InitializeCore();
+ InitializeVersion();
+ }
+
+ private void InitializeCore()
+ {
+ Projects = Context.GetDirectories("./src/*");
+ TestProjects = Context.GetDirectories("./test/*");
+ ProjectFiles = Context.GetFiles("./src/*/*.csproj");
+ TestProjectFiles = Context.GetFiles("./test/*/*.csproj");
+
+ var buildSystem = Context.BuildSystem();
+ if (!buildSystem.IsLocalBuild)
+ {
+ IsCI = true;
+ if ((buildSystem.IsRunningOnAppVeyor && buildSystem.AppVeyor.Environment.Repository.Tag.IsTag) ||
+ (buildSystem.IsRunningOnTravisCI && string.IsNullOrWhiteSpace(buildSystem.TravisCI.Environment.Build.Tag)))
+ {
+ IsTagged = true;
+ }
+ }
+
+ Configuration = Context.Argument("Configuration", "Debug");
+ if (IsCI)
+ {
+ Configuration = "Release";
+ }
+ }
+
+ private void InitializeVersion()
+ {
+ var versionFile = Context.File("./build/version.props");
+ var content = System.IO.File.ReadAllText(versionFile.Path.FullPath);
+
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml(content);
+
+ var versionMajor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMajor").InnerText;
+ var versionMinor = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionMinor").InnerText;
+ var versionPatch = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionPatch").InnerText;
+ var versionQuality = doc.DocumentElement.SelectSingleNode("/Project/PropertyGroup/VersionQuality").InnerText;
+ versionQuality = string.IsNullOrWhiteSpace(versionQuality) ? null : versionQuality;
+
+ var suffix = versionQuality;
+ if (!IsTagged)
+ {
+ suffix += (IsCI ? "ci-" : "dv-") + Util.CreateStamp();
+ }
+ suffix = string.IsNullOrWhiteSpace(suffix) ? null : suffix;
+
+ Version =
+ new BuildVersion(int.Parse(versionMajor), int.Parse(versionMinor), int.Parse(versionPatch), versionQuality);
+ Version.Suffix = suffix;
+ }
+}
+
+public class BuildVersion
+{
+ public BuildVersion(int major, int minor, int patch, string quality)
+ {
+ Major = major;
+ Minor = minor;
+ Patch = patch;
+ Quality = quality;
+ }
+
+ public int Major { get; set; }
+ public int Minor { get; set; }
+ public int Patch { get; set; }
+ public string Quality { get; set; }
+ public string Suffix { get; set; }
+
+ public string VersionWithoutQuality()
+ {
+ return $"{Major}.{Minor}.{Patch}";
+ }
+
+ public string Version()
+ {
+ return VersionWithoutQuality() + (Quality == null ? string.Empty : $"-{Quality}");
+ }
+
+ public string VersionWithSuffix()
+ {
+ return Version() + (Suffix == null ? string.Empty : $"-{Suffix}");
+ }
+}
diff --git a/build/version.props b/build/version.props
new file mode 100644
index 0000000..15a038f
--- /dev/null
+++ b/build/version.props
@@ -0,0 +1,9 @@
+
+
+ 0
+ 7
+ 2
+
+ $(VersionMajor).$(VersionMinor).$(VersionPatch)
+
+
diff --git a/samples/Sample.Kafka/AppDbContext.cs b/samples/Sample.Kafka/AppDbContext.cs
index e929396..4b19e10 100644
--- a/samples/Sample.Kafka/AppDbContext.cs
+++ b/samples/Sample.Kafka/AppDbContext.cs
@@ -10,6 +10,16 @@ namespace Sample.Kafka
{
public class AppDbContext : DbContext
{
+
+ public AppDbContext(DbContextOptions options) : base(options) {
+ }
+
public DbSet Messages { get; set; }
+
+ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {
+ //optionsBuilder.UseSqlServer
+ base.OnConfiguring(optionsBuilder);
+ }
+
}
}
diff --git a/samples/Sample.Kafka/Controllers/ValuesController.cs b/samples/Sample.Kafka/Controllers/ValuesController.cs
index 8fc02af..c9d1032 100644
--- a/samples/Sample.Kafka/Controllers/ValuesController.cs
+++ b/samples/Sample.Kafka/Controllers/ValuesController.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Cap.Consistency.Consumer;
+using Cap.Consistency.Infrastructure;
using Cap.Consistency.Kafka;
using Cap.Consistency.Producer;
using Microsoft.AspNetCore.Mvc;
@@ -13,13 +14,25 @@ namespace Sample.Kafka.Controllers
public class ValuesController : Controller, IConsumerService
{
private readonly IProducerClient _producer;
+ private readonly AppDbContext _dbContext;
- public ValuesController(IProducerClient producer) {
+ public ValuesController(IProducerClient producer, AppDbContext dbContext) {
_producer = producer;
+ _dbContext = dbContext;
}
[Route("/")]
public IActionResult Index() {
+
+ _dbContext.Add(new ConsistencyMessage {
+ Id = Guid.NewGuid().ToString(),
+ SendTime = DateTime.Now,
+ Payload = "testdata",
+ UpdateTime = DateTime.Now
+ });
+
+ _dbContext.SaveChanges();
+
return Ok();
}
diff --git a/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs
new file mode 100644
index 0000000..d669814
--- /dev/null
+++ b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.Designer.cs
@@ -0,0 +1,40 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Sample.Kafka;
+using Cap.Consistency.Infrastructure;
+
+namespace Sample.Kafka.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ [Migration("20170616102520_InitMessages")]
+ partial class InitMessages
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+ modelBuilder
+ .HasAnnotation("ProductVersion", "1.1.2")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Cap.Consistency.Infrastructure.ConsistencyMessage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Payload");
+
+ b.Property("SendTime");
+
+ b.Property("Status");
+
+ b.Property("UpdateTime");
+
+ b.HasKey("Id");
+
+ b.ToTable("Messages");
+ });
+ }
+ }
+}
diff --git a/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs
new file mode 100644
index 0000000..96be53f
--- /dev/null
+++ b/samples/Sample.Kafka/Migrations/20170616102520_InitMessages.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace Sample.Kafka.Migrations
+{
+ public partial class InitMessages : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Messages",
+ columns: table => new
+ {
+ Id = table.Column(nullable: false),
+ Payload = table.Column(nullable: true),
+ SendTime = table.Column(nullable: false),
+ Status = table.Column(nullable: false),
+ UpdateTime = table.Column(nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Messages", x => x.Id);
+ });
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Messages");
+ }
+ }
+}
diff --git a/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs b/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs
new file mode 100644
index 0000000..7c0e777
--- /dev/null
+++ b/samples/Sample.Kafka/Migrations/AppDbContextModelSnapshot.cs
@@ -0,0 +1,39 @@
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Sample.Kafka;
+using Cap.Consistency.Infrastructure;
+
+namespace Sample.Kafka.Migrations
+{
+ [DbContext(typeof(AppDbContext))]
+ partial class AppDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+ modelBuilder
+ .HasAnnotation("ProductVersion", "1.1.2")
+ .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
+
+ modelBuilder.Entity("Cap.Consistency.Infrastructure.ConsistencyMessage", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd();
+
+ b.Property("Payload");
+
+ b.Property("SendTime");
+
+ b.Property("Status");
+
+ b.Property("UpdateTime");
+
+ b.HasKey("Id");
+
+ b.ToTable("Messages");
+ });
+ }
+ }
+}
diff --git a/samples/Sample.Kafka/Sample.Kafka.csproj b/samples/Sample.Kafka/Sample.Kafka.csproj
index f663107..d06b1b2 100644
--- a/samples/Sample.Kafka/Sample.Kafka.csproj
+++ b/samples/Sample.Kafka/Sample.Kafka.csproj
@@ -12,11 +12,14 @@
+
+
+
diff --git a/samples/Sample.Kafka/Startup.cs b/samples/Sample.Kafka/Startup.cs
index 8d44e9c..05cdc6d 100644
--- a/samples/Sample.Kafka/Startup.cs
+++ b/samples/Sample.Kafka/Startup.cs
@@ -28,7 +28,9 @@ namespace Sample.Kafka
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
- services.AddDbContext();
+ services.AddDbContext(x => {
+ x.UseSqlServer(Configuration["ConnectionString"]);
+ });
services.AddConsistency()
.AddEntityFrameworkStores()
diff --git a/samples/Sample.Kafka/appsettings.json b/samples/Sample.Kafka/appsettings.json
index 5fff67b..7248623 100644
--- a/samples/Sample.Kafka/appsettings.json
+++ b/samples/Sample.Kafka/appsettings.json
@@ -1,4 +1,5 @@
{
+ "ConnectionString": "Server=192.168.2.206;Initial Catalog=AspNetCoreSpa;User Id=cmswuliu;Password=h7xY81agBn*Veiu3;MultipleActiveResultSets=True",
"Logging": {
"IncludeScopes": false,
"LogLevel": {