This commit is contained in:
Mohamed Mohsen 2018-01-29 16:07:35 +02:00
Родитель cc544431f1
Коммит 4cdd0a714f
578 изменённых файлов: 38716 добавлений и 23 удалений

285
Backend/.gitignore поставляемый Normal file
Просмотреть файл

@ -0,0 +1,285 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
**/Properties/launchSettings.json
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Comment the next line if you want to checkin your web deploy settings
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush
.cr/
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Visual Studio Code
.vscode/
# Publish profiles
PublishProfiles/
src/Trackable.Web/wwwroot/dist/**
!src/Trackable.Web/wwwroot/dist/swagger/
!src/Trackable.Web/wwwroot/dist/swagger/swagger.js

92
Backend/Trackable.sln Normal file
Просмотреть файл

@ -0,0 +1,92 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27004.2005
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{27997A27-AD3D-4136-B2D0-DE27E8CF41F4}"
ProjectSection(SolutionItems) = preProject
.gitignore = .gitignore
README.md = README.md
EndProjectSection
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Trackable.Web", "src\Trackable.Web\Trackable.Web.csproj", "{389689E3-D4C9-4727-A2B3-AC1C10FE6934}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.Common", "src\Trackable.Common\Trackable.Common.csproj", "{2C1543F6-CD61-4455-8D6E-BB83721F25EE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.EntityFramework", "src\Trackable.EntityFramework\Trackable.EntityFramework.csproj", "{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.Repositories", "src\Trackable.Repositories\Trackable.Repositories.csproj", "{11F3B370-096A-4D99-B5A4-9680D598C881}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.TripDetection", "src\Trackable.TripDetection\Trackable.TripDetection.csproj", "{23D218DA-4BA5-426C-8F97-E7EB569DEFA8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.Configurations", "src\Trackable.Configurations\Trackable.Configurations.csproj", "{3D831301-E570-46C1-99F2-4605E6FAAC27}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.Services", "src\Trackable.Services\Trackable.Services.csproj", "{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Trackable.Models", "src\Trackable.Models\Trackable.Models.csproj", "{E101551A-0727-4CD4-8C38-65BF8884F5DD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Trackable.Func", "src\Trackable.Func\Trackable.Func.csproj", "{E83655CF-A05B-496E-98F7-0D404489E522}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{389689E3-D4C9-4727-A2B3-AC1C10FE6934}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{389689E3-D4C9-4727-A2B3-AC1C10FE6934}.Debug|Any CPU.Build.0 = Debug|Any CPU
{389689E3-D4C9-4727-A2B3-AC1C10FE6934}.Release|Any CPU.ActiveCfg = Release|Any CPU
{389689E3-D4C9-4727-A2B3-AC1C10FE6934}.Release|Any CPU.Build.0 = Release|Any CPU
{2C1543F6-CD61-4455-8D6E-BB83721F25EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2C1543F6-CD61-4455-8D6E-BB83721F25EE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2C1543F6-CD61-4455-8D6E-BB83721F25EE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2C1543F6-CD61-4455-8D6E-BB83721F25EE}.Release|Any CPU.Build.0 = Release|Any CPU
{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD}.Release|Any CPU.Build.0 = Release|Any CPU
{11F3B370-096A-4D99-B5A4-9680D598C881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{11F3B370-096A-4D99-B5A4-9680D598C881}.Debug|Any CPU.Build.0 = Debug|Any CPU
{11F3B370-096A-4D99-B5A4-9680D598C881}.Release|Any CPU.ActiveCfg = Release|Any CPU
{11F3B370-096A-4D99-B5A4-9680D598C881}.Release|Any CPU.Build.0 = Release|Any CPU
{23D218DA-4BA5-426C-8F97-E7EB569DEFA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{23D218DA-4BA5-426C-8F97-E7EB569DEFA8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{23D218DA-4BA5-426C-8F97-E7EB569DEFA8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{23D218DA-4BA5-426C-8F97-E7EB569DEFA8}.Release|Any CPU.Build.0 = Release|Any CPU
{3D831301-E570-46C1-99F2-4605E6FAAC27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D831301-E570-46C1-99F2-4605E6FAAC27}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D831301-E570-46C1-99F2-4605E6FAAC27}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D831301-E570-46C1-99F2-4605E6FAAC27}.Release|Any CPU.Build.0 = Release|Any CPU
{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F}.Release|Any CPU.Build.0 = Release|Any CPU
{E101551A-0727-4CD4-8C38-65BF8884F5DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E101551A-0727-4CD4-8C38-65BF8884F5DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E101551A-0727-4CD4-8C38-65BF8884F5DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E101551A-0727-4CD4-8C38-65BF8884F5DD}.Release|Any CPU.Build.0 = Release|Any CPU
{E83655CF-A05B-496E-98F7-0D404489E522}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E83655CF-A05B-496E-98F7-0D404489E522}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E83655CF-A05B-496E-98F7-0D404489E522}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E83655CF-A05B-496E-98F7-0D404489E522}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{389689E3-D4C9-4727-A2B3-AC1C10FE6934} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{2C1543F6-CD61-4455-8D6E-BB83721F25EE} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{A6B23FF3-82F4-4F29-960C-60C2F09ECCAD} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{11F3B370-096A-4D99-B5A4-9680D598C881} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{23D218DA-4BA5-426C-8F97-E7EB569DEFA8} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{3D831301-E570-46C1-99F2-4605E6FAAC27} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{6615A7C7-9FCD-4519-A3FC-4BBA66A1329F} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{E101551A-0727-4CD4-8C38-65BF8884F5DD} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
{E83655CF-A05B-496E-98F7-0D404489E522} = {0561E119-10FD-4C6A-AC8B-2B0EE5EF0BA6}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {CA4659C2-5F70-4BDE-8665-FFEF8F4234AD}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Common
{
public class AsyncLazy<T> : Lazy<Task<T>>
{
public AsyncLazy() :
base()
{ }
public AsyncLazy(Func<T> valueFactory) :
base(() => Task.Factory.StartNew(valueFactory))
{ }
public AsyncLazy(Func<Task<T>> taskFactory) :
base(() => Task.Factory.StartNew(() => taskFactory()).Unwrap())
{ }
public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); }
}
}

Просмотреть файл

@ -0,0 +1,90 @@
using System;
namespace Trackable.Common
{
public static class DateTimeUtils
{
/// <summary>
/// Get the equivalent datetime from the provided timestamp
/// </summary>
/// <param name="unixTime">Number of milliseconds since the epoch</param>
/// <returns></returns>
public static DateTime FromUnixTime(long unixTime)
{
var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
return epoch.AddMilliseconds(unixTime);
}
/// <summary>
/// Gets the equivalent timestamp from the provided time
/// </summary>
/// <param name="time">the time</param>
/// <returns></returns>
public static long ToUnixTime(DateTime time)
{
return (time.Ticks - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).Ticks) / TimeSpan.TicksPerMillisecond;
}
/// <summary>
/// Convert the timestamp from milliseconds to seconds
/// </summary>
/// <param name="timestamp">Number of milliseconds since the epoch</param>
/// <returns>Corresponding number of seconds</returns>
public static long TimestampToSeconds(long timestamp)
{
return timestamp / 1000;
}
/// <summary>
/// Convert the timestamp from seconds to milliseconds
/// </summary>
/// <param name="timestamp">Number of seconds since the epoch</param>
/// <returns>Corresponding number of milliseconds</returns>
public static long SecondsToTimestamp(long timestamp)
{
return timestamp * 1000;
}
/// <summary>
/// Increment the timestamp
/// </summary>
/// <param name="timestamp">Number of milliseconds since the epoch</param>
/// <param name="seconds">Number of seconds to increment the timestamp by</param>
/// <returns></returns>
public static long IncrementTimestamp(long timestamp, long seconds)
{
return timestamp + SecondsToTimestamp(seconds);
}
/// <summary>
/// Difference between two timestamps in seconds
/// </summary>
/// <param name="timestamp1">Number of milliseconds since the epoch</param>
/// <param name="timestamp2">Number of milliseconds since the epoch</param>
/// <returns></returns>
public static long DifferenceInMilliseconds(long timestamp1, long timestamp2)
{
return Math.Abs(timestamp1 - timestamp2);
}
/// <summary>
/// Get Current time as seconds from epoch
/// </summary>
/// <returns></returns>
public static long CurrentTimeInSeconds()
{
long epochTicks = new DateTime(1970, 1, 1).Ticks;
return ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerSecond);
}
/// <summary>
/// Get Current time as milliseconds from epoch
/// </summary>
/// <returns></returns>
public static long CurrentTimeInMillseconds()
{
long epochTicks = new DateTime(1970, 1, 1).Ticks;
return ((DateTime.UtcNow.Ticks - epochTicks) / TimeSpan.TicksPerMillisecond);
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
namespace Trackable.Common
{
public static class EnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action)
{
foreach (T item in enumeration)
{
action(item);
}
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Common.Exceptions
{
public class BadArgumentException : ExceptionBase
{
public BadArgumentException(string userFriendlyMessage)
: base(userFriendlyMessage)
{
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trackable.Common.Exceptions;
namespace Trackable.Common.Exceptions
{
public class DuplicateResourceException : ResourceExceptionBase
{
public DuplicateResourceException(string userFriendlyMessage)
:base(userFriendlyMessage)
{
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Common.Exceptions
{
public class ExceptionBase : Exception
{
public ExceptionBase(string userFriendlyMessage)
:base(userFriendlyMessage)
{
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Common.Exceptions
{
public class ResourceExceptionBase : ExceptionBase
{
public ResourceExceptionBase(string userFriendlyMessage)
: base(userFriendlyMessage)
{
}
}
}

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trackable.Common.Exceptions;
namespace Trackable.Common.Exceptions
{
public class ResourceNotFoundException : ResourceExceptionBase
{
public ResourceNotFoundException(string userFriendlyMessage)
:base(userFriendlyMessage)
{
}
}
}

Просмотреть файл

@ -0,0 +1,61 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using Trackable.Common.Exceptions;
namespace Trackable.Common
{
public static class ILoggerExtensions
{
private static bool HeavyDebugEnabled { get; set; } = false;
public static void SetHeavyDebugEnabled(this IApplicationBuilder factory, bool heavyDebugEnabled)
{
HeavyDebugEnabled = heavyDebugEnabled;
}
public static void LogDebugSerialize(this ILogger logger, string formatMessage, params object[] objects)
{
if (HeavyDebugEnabled)
{
logger.LogDebug(string.Format(formatMessage, SerializeObjects(objects)));
}
else
{
logger.LogDebug(formatMessage, objects);
}
}
public static void LogError(this ILogger logger, Exception e)
{
logger.LogError("Exception occured with message {0} and exception {1}", e.Message, e.ToString());
}
public static void LogWarning(this ILogger logger, Exception e)
{
logger.LogWarning("Exception occured with message {0} and exception {1}", e.Message, e.ToString());
}
private static string[] SerializeObjects(object[] objects)
{
var serializedObjects = new string[objects.Length];
var converter = JsonSerializer.Create(GetSerializerSettings());
for (int i = 0; i < objects.Length; i++)
{
serializedObjects[i] = JsonConvert.SerializeObject(objects[i], GetSerializerSettings());
}
return serializedObjects;
}
private static JsonSerializerSettings GetSerializerSettings()
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter());
return settings;
}
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
namespace Trackable.Common
{
public static class ListExtensions
{
public static void AddRange<T>(this IList<T> list, IEnumerable<T> elementsToAdd)
{
foreach (T item in elementsToAdd)
{
list.Add(item);
}
}
}
}

Просмотреть файл

@ -0,0 +1,27 @@
using System;
namespace Trackable.Common
{
public static class ObjectExtensions
{
public static T ThrowIfNull<T>(this T obj, string paramName)
{
if (obj == null)
{
throw new ArgumentNullException(paramName);
}
return obj;
}
public static string ThrowIfNullOrEmpty(this string obj, string paramName)
{
if (string.IsNullOrEmpty(obj))
{
throw new ArgumentNullException(paramName);
}
return obj;
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Trackable.Common")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Trackable.Common")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("2c1543f6-cd61-4455-8d6e-bb83721f25ee")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" 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>{2C1543F6-CD61-4455-8D6E-BB83721F25EE}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Trackable.Common</RootNamespace>
<AssemblyName>Trackable.Common</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<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="Microsoft.AspNetCore.Http.Abstractions, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AspNetCore.Http.Abstractions.1.1.1\lib\net451\Microsoft.AspNetCore.Http.Abstractions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.AspNetCore.Http.Features, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.AspNetCore.Http.Features.1.1.1\lib\net451\Microsoft.AspNetCore.Http.Features.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Extensions.DependencyInjection.Abstractions, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Extensions.DependencyInjection.Abstractions.1.1.1\lib\netstandard1.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Extensions.Logging, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Extensions.Logging.1.1.1\lib\netstandard1.1\Microsoft.Extensions.Logging.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Extensions.Logging.Abstractions, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Extensions.Logging.Abstractions.1.1.1\lib\netstandard1.1\Microsoft.Extensions.Logging.Abstractions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Extensions.Primitives, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Extensions.Primitives.1.1.1\lib\netstandard1.0\Microsoft.Extensions.Primitives.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.Win32.Primitives, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.Composition" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\System.Net.Http.4.3.0\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Xml.ReaderWriter, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)\packages\System.Xml.ReaderWriter.4.3.0\lib\net46\System.Xml.ReaderWriter.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AsyncLazy.cs" />
<Compile Include="DateTimeUtils.cs" />
<Compile Include="Exceptions\BadArgumentException.cs" />
<Compile Include="Exceptions\DuplicateResourceException.cs" />
<Compile Include="Exceptions\ExceptionBase.cs" />
<Compile Include="Exceptions\ResourceExceptionBase.cs" />
<Compile Include="Exceptions\ResourceNotFoundException.cs" />
<Compile Include="ILoggerExtensions.cs" />
<Compile Include="ListExtensions.cs" />
<Compile Include="EnumerableExtensions.cs" />
<Compile Include="ObjectExtensions.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UserRoles.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

Просмотреть файл

@ -0,0 +1,15 @@
<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>aa</authors>
<owners>aa</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>d</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2017</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
</package>

Просмотреть файл

@ -0,0 +1,24 @@
namespace Trackable.Common
{
public class UserRoles
{
public const string Blocked = "Blocked";
public const string Pending = "Pending";
public const string DeviceRegistration = "DeviceRegistration";
public const string TrackingDevice = "TrackingDevice";
public const string Viewer = "Viewer";
public const string Administrator = "Administrator";
public const string Owner = "Owner";
public static string[] Roles => new string[]
{
Blocked,
Pending,
DeviceRegistration,
TrackingDevice,
Viewer,
Administrator,
Owner
};
}
}

Просмотреть файл

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/></startup></configuration>

Просмотреть файл

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNetCore.Http.Abstractions" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.AspNetCore.Http.Features" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.Extensions.DependencyInjection.Abstractions" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.Extensions.Logging" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.Extensions.Primitives" version="1.1.1" targetFramework="net46" />
<package id="Microsoft.NETCore.Platforms" version="2.0.0" targetFramework="net46" />
<package id="Microsoft.Win32.Primitives" version="4.3.0" targetFramework="net46" />
<package id="NETStandard.Library" version="1.6.1" targetFramework="net46" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net46" />
<package id="System.Net.Http" version="4.3.0" targetFramework="net46" />
</packages>

Просмотреть файл

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Configurations
{
[AttributeUsage(AttributeTargets.Parameter)]
public class ConfigurableAttribute : Attribute
{
private readonly object defaultValue;
private readonly string description;
public ConfigurableAttribute(object defaultValue, string description = "")
{
this.defaultValue = defaultValue;
this.description = description;
}
}
}

Просмотреть файл

@ -0,0 +1,125 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Trackable.Repositories;
using Trackable.Models;
namespace Trackable.Configurations
{
public class ConfigurationManager : IConfigurationManager
{
private readonly IConfigurationRepository configurationRepository;
private readonly string namespacePrefix;
private readonly string specificNamespace;
public ConfigurationManager(IConfigurationRepository configurationRepository, string namespacePrefix, string specificNamespace)
{
this.configurationRepository = configurationRepository;
this.namespacePrefix = namespacePrefix;
this.specificNamespace = specificNamespace;
}
public async Task<T> LoadWithDefaultsAsync<T>(params object[] allParameters)
{
var type = typeof(T);
var constructor = type.GetConstructors()
.FirstOrDefault(c => c.GetParameters().Any(p => p.CustomAttributes.Any(ca => ca.AttributeType == typeof(ConfigurableAttribute))));
if (constructor == null)
{
constructor = type.GetConstructor(allParameters.Select(p => p.GetType()).ToArray());
}
if (constructor == null)
{
return (T)Activator.CreateInstance(type);
}
var parameters = constructor.GetParameters();
var consturctorParametersList = new List<object>();
var nonConfigurableParametersCounter = 0;
foreach (var paramater in parameters)
{
var parameterValue = allParameters[nonConfigurableParametersCounter++];
var config = await FindOrCreateConfiguration(type.Name, paramater.Name, parameterValue, defaultIsSpecific: true);
consturctorParametersList.Add(config.GetValue(paramater.ParameterType));
}
return (T)constructor.Invoke(consturctorParametersList.ToArray());
}
public async Task<T> LoadAsync<T>(params object[] nonConfigurableParameters)
{
var type = typeof(T);
var constructor = type.GetConstructors()
.FirstOrDefault(c => c.GetParameters().Any(p => p.CustomAttributes.Any(ca => ca.AttributeType == typeof(ConfigurableAttribute))));
if (constructor == null)
{
constructor = type.GetConstructor(nonConfigurableParameters.Select(p => p.GetType()).ToArray());
}
if (constructor == null)
{
return (T)Activator.CreateInstance(type);
}
var parameters = constructor.GetParameters();
var consturctorParametersList = new List<object>();
var nonConfigurableParametersCounter = 0;
foreach (var paramater in parameters)
{
var configurableAttribute = paramater.CustomAttributes.FirstOrDefault(c => c.AttributeType == typeof(ConfigurableAttribute));
if (configurableAttribute != null)
{
var defaultValue = configurableAttribute.ConstructorArguments[0].Value;
var description = configurableAttribute.ConstructorArguments[1].Value.ToString();
var config = await FindOrCreateConfiguration(type.Name, paramater.Name, defaultValue);
consturctorParametersList.Add(config.GetValue(paramater.ParameterType));
}
else
{
consturctorParametersList.Add(nonConfigurableParameters[nonConfigurableParametersCounter++]);
}
}
return (T)constructor.Invoke(consturctorParametersList.ToArray());
}
private async Task<Configuration> FindOrCreateConfiguration(
string componentName,
string parameterName,
object defaultValue,
string description = "",
bool defaultIsSpecific = false)
{
var specificNamespace = $"{this.namespacePrefix}.{this.specificNamespace}.{componentName}";
var commonNamespace = $"{this.namespacePrefix}.Common.{componentName}";
var config = await this.configurationRepository.GetAsync(specificNamespace, parameterName);
if (config == null)
{
config = await this.configurationRepository.GetAsync(commonNamespace, parameterName);
}
if (config == null)
{
config = new Configuration(defaultIsSpecific ? specificNamespace : commonNamespace,
parameterName, description, defaultValue);
await this.configurationRepository.AddAsync(config);
}
return config;
}
}
}

Просмотреть файл

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.Configurations
{
interface IConfigurationManager
{
/// <summary>
/// Creates an instance of a class that has constructor parameters marked with the
/// configurable attribute. Configurable parameters take the corresponding configuration value
/// in the database. If no value is present, a new value is created using the default specified
/// in the configurable attribute. Parameters not marked with a configurable attribute must be
/// passed in order to this function
/// </summary>
/// <typeparam name="T">Type of class to be instantiated</typeparam>
/// <param name="nonConfigurableParameters">Constructor parameters that dont have a configurable attribute in order</param>
/// <returns>The async task containing the newly created instance</returns>
Task<T> LoadAsync<T>(params object[] nonConfigurableParameters);
/// <summary>
/// Creates an instance of a class that has constructor parameters marked with the
/// configurable attribute. Configurable parameters take the corresponding configuration value
/// in the database. If no value is present, a new value is created using the default specified
/// in the passed parameters. Defaults create using this method override defaults created from
/// configurable attribute.
/// </summary>
/// <typeparam name="T">Type of class to be instantiated</typeparam>
/// <param name="nonConfigurableParameters">All constructor parameters</param>
/// <returns>The async task containing the newly created instance</returns>
Task<T> LoadWithDefaultsAsync<T>(params object[] allParameters);
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Trackable.Configuration")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Trackable.Configuration")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("3d831301-e570-46c1-99f2-4605e6faac27")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" 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>{3D831301-E570-46C1-99F2-4605E6FAAC27}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Trackable.Configurations</RootNamespace>
<AssemblyName>Trackable.Configurations</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<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="System" />
<Reference Include="System.Core" />
<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="ConfigurableAttribute.cs" />
<Compile Include="ConfigurationManager.cs" />
<Compile Include="IConfigurationManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Trackable.Models\Trackable.Models.csproj">
<Project>{e101551a-0727-4cd4-8c38-65bf8884f5dd}</Project>
<Name>Trackable.Models</Name>
</ProjectReference>
<ProjectReference Include="..\Trackable.Repositories\Trackable.Repositories.csproj">
<Project>{11F3B370-096A-4D99-B5A4-9680D598C881}</Project>
<Name>Trackable.Repositories</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

Просмотреть файл

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-9.0.0.0" newVersion="9.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="AutoMapper" publicKeyToken="be96cd2c38ef1005" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.2.0" newVersion="6.0.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
</configuration>

Просмотреть файл

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
</configSections>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Просмотреть файл

@ -0,0 +1,23 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Trackable.EntityFramework
{
[Table("Assets")]
public class AssetData : EntityBase<string>
{
public TrackingDeviceData TrackingDevice { get; set; }
public ICollection<GeoFenceUpdateData> NotificationHistory { get; set; }
public ICollection<GeoFenceData> GeoFenceDatas { get; set; }
[Required]
public int AssetType { get; set; }
public AssetPropertiesData AssetProperties { get; set; }
public TrackingPointData LatestPosition { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.EntityFramework
{
[Table("AssetProperties")]
public class AssetPropertiesData: EntityBase<int>
{
public double? AssetHeight { get; set; }
public double? AssetWidth { get; set; }
public double? AssetLength { get; set; }
public double? AssetWeight { get; set; }
public int? AssetAxels { get; set; }
public int? AssetTrailers { get; set; }
public bool? AssetSemi { get; set; }
public double? AssetMaxGradient { get; set; }
public double? AssetMinTurnRadius { get; set; }
public AssetData Asset { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
namespace Trackable.EntityFramework
{
[Table("Configurations")]
public class ConfigurationData : EntityBase<string, string>
{
public string Description{ get; set; }
public string Value { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,308 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Trackable.EntityFramework;
namespace Trackable.Repositories
{
public static class DbContextBulkOperations
{
private static string GenericTypeCreateSQL = @"
IF NOT EXISTS (SELECT * FROM sys.types WHERE is_table_type = 1 AND name = '{0}')
CREATE TYPE {0} AS TABLE
(
{1},
{2}
);
";
private static string GenericProcedureCreateSQL = @"
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('{0}'))
exec('CREATE PROCEDURE {0} AS BEGIN SET NOCOUNT ON; END')
";
private static string GenericProcedureAlterSQL = @"
ALTER PROCEDURE {0}
@TVP {1} READONLY
AS
BEGIN
MERGE INTO {2} AS T
USING @TVP AS S
ON {3}
WHEN MATCHED THEN UPDATE SET {4};
END
";
/// <summary>
/// Bulk updates the specified fields in the supplied items.
/// </summary>
/// <typeparam name="TEntity">The type of the items to be updated</typeparam>
/// <param name="context">The database context used to update</param>
/// <param name="items">List of items that will be updated</param>
/// <param name="fieldsToUpdate">Fields in type TEntity that will be updated. Leave empty to update all fields</param>
/// <returns></returns>
public static async Task UpdateAsync<TEntity>(
this DbContext context,
IEnumerable<TEntity> items,
params string[] fieldsToUpdate) where TEntity : class
{
var objectType = ObjectContext.GetObjectType(typeof(TEntity));
var tableName = context.GetTableName<TEntity>();
var primaryKeyNames = context.GetPrimaryKeyNames<TEntity>();
var primaryKeyProperties = objectType
.GetProperties()
.Where(p => primaryKeyNames.Contains(p.Name));
var fieldProperties = objectType
.GetProperties()
.Where(p => !primaryKeyNames.Contains(p.Name));
if(fieldsToUpdate != null && fieldsToUpdate.Any())
{
fieldProperties = fieldProperties.Where(f => fieldsToUpdate.Contains(f.Name));
}
var rows = new List<List<Object>>();
foreach (var item in items)
{
var row = new List<object>();
row.AddRange(primaryKeyProperties.Select(f => f.GetValue(item)));
row.AddRange(fieldProperties.Select(f => f.GetValue(item)));
rows.Add(row);
}
await UpdateAsync(
context,
tableName,
primaryKeyProperties.ToDictionary(f => f.Name, f => f.PropertyType),
fieldProperties.ToDictionary(f => f.Name, f => f.PropertyType),
rows);
}
private static async Task UpdateAsync(
DbContext context,
string tableName,
IDictionary<string, Type> idFields,
IDictionary<string, Type> fieldsToUpdate,
IEnumerable<List<Object>> rows)
{
var table = new DataTable();
// Id fields are guaranteed to be primitives
foreach (var idField in idFields)
{
table.Columns.Add(idField.Key, idField.Value);
}
var primitiveFields = new Dictionary<string, Type>();
var excludedColumns = new List<int>();
int index = idFields.Count;
foreach (var column in fieldsToUpdate)
{
// DataTable does not support Nullable types, instead primitive types should be added
// and the column marked as AllowDbNull
if (column.Value.IsGenericType && column.Value.GetGenericTypeDefinition() == typeof(Nullable<>))
{
DataColumn col = new DataColumn(column.Key, column.Value.GetGenericArguments().First());
col.AllowDBNull = true;
table.Columns.Add(col);
primitiveFields.Add(column.Key, column.Value.GetGenericArguments().First());
}
else if(SqlTypeHelper.GetDbType(column.Value).HasValue)
{
table.Columns.Add(column.Key, column.Value);
primitiveFields.Add(column.Key, column.Value);
}
else
{
// Column is unsupported type. Do not include it.
excludedColumns.Add(index);
}
index++;
}
excludedColumns.Reverse();
foreach (var row in rows)
{
foreach(var col in excludedColumns)
{
row.RemoveAt(col);
}
table.Rows.Add(row.ToArray());
}
var connectionInitialState = context.Database.Connection.State;
try
{
if (connectionInitialState != ConnectionState.Open)
{
await context.Database.Connection.OpenAsync();
}
var typeName = await ExecuteTypeSqlCommand(context, tableName, idFields, primitiveFields);
var storedProcedureName = await ExecuteStoredProcedureSqlCommand(context, tableName, typeName, idFields, primitiveFields);
await ExecuteUpdateAsync(context, table, storedProcedureName, typeName);
}
finally
{
if (connectionInitialState != ConnectionState.Open)
{
context.Database.Connection.Close();
}
}
}
private async static Task ExecuteUpdateAsync(DbContext context, DataTable table, string storedProcedureName, string typeName)
{
using (var command = context.Database.Connection.CreateCommand())
{
command.CommandText = storedProcedureName;
command.CommandType = CommandType.StoredProcedure;
var tableParameter = new SqlParameter("TVP", table);
tableParameter.SqlDbType = SqlDbType.Structured;
tableParameter.TypeName = typeName;
command.Parameters.Add(tableParameter);
await command.ExecuteNonQueryAsync();
}
}
private async static Task<string> ExecuteTypeSqlCommand(
DbContext context,
string tableName,
IDictionary<string, Type> idFields,
IDictionary<string, Type> fieldsToUpdate)
{
using (var command = context.Database.Connection.CreateCommand())
{
var typeName = GetUniqueTypeName(tableName, fieldsToUpdate);
var idFieldsString =
string.Join(",", idFields.Select(f => $"{f.Key} {SqlTypeHelper.GetDbType(f.Value).ToString()}"));
var fieldsToUpdateBuilder = new StringBuilder();
foreach (var fieldToUpdate in fieldsToUpdate)
{
var sqlType = SqlTypeHelper.GetDbType(fieldToUpdate.Value);
var sqlTypeString = sqlType.ToString();
if(sqlType == SqlDbType.NVarChar)
{
sqlTypeString += "(MAX)";
}
fieldsToUpdateBuilder.Append($"{fieldToUpdate.Key} {sqlTypeString},");
}
command.CommandType = CommandType.Text;
command.CommandText = string.Format(
GenericTypeCreateSQL,
typeName,
idFieldsString,
fieldsToUpdateBuilder.ToString(0, fieldsToUpdateBuilder.Length - 1));
await command.ExecuteNonQueryAsync();
return typeName;
}
}
private async static Task<string> ExecuteStoredProcedureSqlCommand(
DbContext context,
string tableName,
string typeName,
IDictionary<string, Type> idFields,
IDictionary<string, Type> fieldsToUpdate)
{
var procedureName = $"sp_{typeName}";
using (var command = context.Database.Connection.CreateCommand())
{
command.CommandType = CommandType.Text;
command.CommandText = string.Format(
GenericProcedureCreateSQL,
procedureName);
await command.ExecuteNonQueryAsync();
}
using (var command = context.Database.Connection.CreateCommand())
{
var fieldsToUpdateString =
string.Join(",", fieldsToUpdate.Select(f => $"T.{f.Key} = S.{f.Key}"));
var idFieldsString =
string.Join(",", idFields.Select(f => $"T.{f.Key} = S.{f.Key}"));
command.CommandType = CommandType.Text;
command.CommandText = string.Format(
GenericProcedureAlterSQL,
procedureName,
typeName,
tableName,
idFieldsString,
fieldsToUpdateString);
await command.ExecuteNonQueryAsync();
}
return procedureName;
}
private static string GetUniqueTypeName(string tableName, IDictionary<string, Type> fieldsToUpdate)
{
var uniqueName = $"{tableName}_";
foreach (var f in fieldsToUpdate)
{
uniqueName += f.Key;
}
return uniqueName;
}
public static string GetTableName<TEntity>(this DbContext context) where TEntity : class
{
ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
return objectContext.GetTableName<TEntity>();
}
public static string GetTableName<TEntity>(this ObjectContext context) where TEntity : class
{
string sql = context.CreateObjectSet<TEntity>().ToTraceString();
Regex regex = new Regex("FROM\\s+\\[.*\\]\\.\\[(?<table>.*)\\]\\s+AS");
Match match = regex.Match(sql);
string table = match.Groups["table"].Value;
return table;
}
public static IEnumerable<string> GetPrimaryKeyNames<TEntity>(this DbContext context) where TEntity : class
{
ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
ObjectSet<TEntity> set = objectContext.CreateObjectSet<TEntity>();
return set.EntitySet.ElementType
.KeyMembers
.Select(k => k.Name);
}
}
}

Просмотреть файл

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Trackable.EntityFramework
{
[Table("DeploymentId")]
public class DeploymentIdData : EntityBase<Guid>
{
}
}

Просмотреть файл

@ -0,0 +1,31 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Trackable.EntityFramework
{
public class EntityBase<TKey>
{
[Key]
public TKey Id { get; set; }
public bool Deleted { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedAtTimeUtc { get; set; }
}
public class EntityBase<TKey1, TKey2>
{
[Key, Column(Order = 0)]
public TKey1 Key1 { get; set; }
[Key, Column(Order = 1)]
public TKey2 Key2 { get; set; }
public bool Deleted { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreatedAtTimeUtc { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,31 @@
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Migrations;
using System.IO;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
namespace Trackable.EntityFramework
{
public static class EntityFrameworkExtensions
{
public static IServiceCollection AddDbContext(this IServiceCollection services, string connectionString, string rootPath)
{
TrackableDbContext.LoadSqlServerTypes(Path.Combine(rootPath, "bin"));
return services.AddScoped(provider => new TrackableDbContext(connectionString));
}
public static IApplicationBuilder UseDb(this IApplicationBuilder builder, string connectionString)
{
var configuration = new Migrations.Configuration
{
TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient")
};
var migrator = new DbMigrator(configuration);
migrator.Update();
return builder;
}
}
}

Просмотреть файл

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
namespace Trackable.EntityFramework
{
[Table("GeoFences")]
public class GeoFenceData : EntityBase<int>
{
[Required]
public string Name { get; set; }
[Required]
public string Emails { get; set; }
[Required]
public int FenceType { get; set; }
[Required]
public long CooldownInMinutes { get; set; }
public DbGeography Polygon { get; set; }
public ICollection<AssetData> AssetDatas { get; set; }
public ICollection<GeoFenceUpdateData> NotificationHistory { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
namespace Trackable.EntityFramework
{
[Table("GeoFenceUpdates")]
public class GeoFenceUpdateData : EntityBase<int>
{
[Required]
public int GeoFenceDataId { get; set; }
[Required]
public string AssetDataId { get; set; }
[Required]
public int Status { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,45 @@
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace SqlServerTypes
{
/// <summary>
/// Utility methods related to CLR Types for SQL Server
/// </summary>
internal class Utilities
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr LoadLibrary(string libname);
/// <summary>
/// Loads the required native assemblies for the current architecture (x86 or x64)
/// </summary>
/// <param name="rootApplicationPath">
/// Root path of the current application. Use Server.MapPath(".") for ASP.NET applications
/// and AppDomain.CurrentDomain.BaseDirectory for desktop applications.
/// </param>
public static void LoadNativeAssemblies(string rootApplicationPath)
{
var nativeBinaryPath = IntPtr.Size > 4
? Path.Combine(rootApplicationPath, @"SqlServerTypes\x64\")
: Path.Combine(rootApplicationPath, @"SqlServerTypes\x86\");
LoadNativeAssembly(nativeBinaryPath, "msvcr120.dll");
LoadNativeAssembly(nativeBinaryPath, "SqlServerSpatial140.dll");
}
private static void LoadNativeAssembly(string nativeBinaryPath, string assemblyName)
{
var path = Path.Combine(nativeBinaryPath, assemblyName);
var ptr = LoadLibrary(path);
if (ptr == IntPtr.Zero)
{
throw new Exception(string.Format(
"Error loading {0} (ErrorCode: {1})",
assemblyName,
Marshal.GetLastWin32Error()));
}
}
}
}

Просмотреть файл

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.Spatial;
namespace Trackable.EntityFramework
{
[Table("Locations")]
public class LocationData : EntityBase<int>
{
public string Name { get; set; }
public string Address { get; set; }
public DbGeography Location { get; set; }
public int? MinimumWaitTime { get; set; }
public int? InterestLevel { get; set; }
}
}

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class Initial : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(Initial));
string IMigrationMetadata.Id
{
get { return "201701181247597_Initial"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,104 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class Initial : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Assets",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.TrackingDevices",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
Name = c.String(),
Model = c.String(),
Phone = c.String(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
AssetId = c.String(maxLength: 128),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Assets", t => t.AssetId)
.Index(t => t.AssetId);
CreateTable(
"dbo.TrackingPoints",
c => new
{
Id = c.Int(nullable: false, identity: true),
DeviceTimeUtc = c.DateTime(nullable: false),
Location = c.Geography(),
Provider = c.String(),
Debug = c.Boolean(nullable: false),
Accuracy = c.Int(),
Speed = c.Int(),
Altitude = c.Int(),
Bearing = c.Int(),
TripId = c.Int(),
AssetId = c.String(nullable: false, maxLength: 128),
TrackingDeviceId = c.String(nullable: false, maxLength: 128),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Assets", t => t.AssetId, cascadeDelete: true)
.ForeignKey("dbo.TrackingDevices", t => t.TrackingDeviceId, cascadeDelete: true)
.ForeignKey("dbo.Trips", t => t.TripId)
.Index(t => t.TripId)
.Index(t => t.AssetId)
.Index(t => t.TrackingDeviceId);
CreateTable(
"dbo.Trips",
c => new
{
Id = c.Int(nullable: false, identity: true),
StartTime = c.DateTime(nullable: false),
EndTime = c.DateTime(nullable: false),
Route = c.Geography(),
AssetId = c.String(nullable: false, maxLength: 128),
TrackingDeviceId = c.String(nullable: false, maxLength: 128),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Assets", t => t.AssetId, cascadeDelete: true)
.ForeignKey("dbo.TrackingDevices", t => t.TrackingDeviceId, cascadeDelete: true)
.Index(t => t.AssetId)
.Index(t => t.TrackingDeviceId);
}
public override void Down()
{
DropForeignKey("dbo.Trips", "TrackingDeviceId", "dbo.TrackingDevices");
DropForeignKey("dbo.TrackingPoints", "TripId", "dbo.Trips");
DropForeignKey("dbo.Trips", "AssetId", "dbo.Assets");
DropForeignKey("dbo.TrackingPoints", "TrackingDeviceId", "dbo.TrackingDevices");
DropForeignKey("dbo.TrackingPoints", "AssetId", "dbo.Assets");
DropForeignKey("dbo.TrackingDevices", "AssetId", "dbo.Assets");
DropIndex("dbo.Trips", new[] { "TrackingDeviceId" });
DropIndex("dbo.Trips", new[] { "AssetId" });
DropIndex("dbo.TrackingPoints", new[] { "TrackingDeviceId" });
DropIndex("dbo.TrackingPoints", new[] { "AssetId" });
DropIndex("dbo.TrackingPoints", new[] { "TripId" });
DropIndex("dbo.TrackingDevices", new[] { "AssetId" });
DropTable("dbo.Trips");
DropTable("dbo.TrackingPoints");
DropTable("dbo.TrackingDevices");
DropTable("dbo.Assets");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class ChangeTrackingPointDeviceTimeToStamp : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(ChangeTrackingPointDeviceTimeToStamp));
string IMigrationMetadata.Id
{
get { return "201701190945492_ChangeTrackingPointDeviceTimeToStamp"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,20 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class ChangeTrackingPointDeviceTimeToStamp : DbMigration
{
public override void Up()
{
AddColumn("dbo.TrackingPoints", "DeviceTimestampUtc", c => c.Long(nullable: false));
DropColumn("dbo.TrackingPoints", "DeviceTimeUtc");
}
public override void Down()
{
AddColumn("dbo.TrackingPoints", "DeviceTimeUtc", c => c.DateTime(nullable: false));
DropColumn("dbo.TrackingPoints", "DeviceTimestampUtc");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddTrackingDeviceOperatingSystemAndVersion : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddTrackingDeviceOperatingSystemAndVersion));
string IMigrationMetadata.Id
{
get { return "201701191420312_AddTrackingDeviceOperatingSystemAndVersion"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,20 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddTrackingDeviceOperatingSystemAndVersion : DbMigration
{
public override void Up()
{
AddColumn("dbo.TrackingDevices", "OperatingSystem", c => c.String());
AddColumn("dbo.TrackingDevices", "Version", c => c.String());
}
public override void Down()
{
DropColumn("dbo.TrackingDevices", "Version");
DropColumn("dbo.TrackingDevices", "OperatingSystem");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddTripsDestinationConfigs : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddTripsDestinationConfigs));
string IMigrationMetadata.Id
{
get { return "201702091023341_AddTripsDestinationConfigs"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,88 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddTripsDestinationConfigs : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Configurations",
c => new
{
Key = c.String(nullable: false, maxLength: 128),
Value = c.String(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Key);
CreateTable(
"dbo.Destinations",
c => new
{
Id = c.Int(nullable: false, identity: true),
Name = c.String(),
Address = c.String(),
Location = c.Geography(),
MinimumWaitTime = c.Int(),
InterestLevel = c.Int(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.TripLegs",
c => new
{
Id = c.Int(nullable: false, identity: true),
StartTime = c.DateTime(nullable: false),
EndTime = c.DateTime(nullable: false),
Route = c.Geography(),
AverageSpeed = c.Double(nullable: false),
TripDataId = c.Int(nullable: false),
StartDestinationId = c.Int(nullable: false),
EndDestinationId = c.Int(nullable: false),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Destinations", t => t.EndDestinationId)
.ForeignKey("dbo.Destinations", t => t.StartDestinationId)
.ForeignKey("dbo.Trips", t => t.TripDataId, cascadeDelete: true)
.Index(t => t.TripDataId)
.Index(t => t.StartDestinationId)
.Index(t => t.EndDestinationId);
AddColumn("dbo.Trips", "StartDestinationId", c => c.Int(nullable: false));
AddColumn("dbo.Trips", "EndDestinationId", c => c.Int(nullable: false));
CreateIndex("dbo.Trips", "StartDestinationId");
CreateIndex("dbo.Trips", "EndDestinationId");
AddForeignKey("dbo.Trips", "EndDestinationId", "dbo.Destinations", "Id");
AddForeignKey("dbo.Trips", "StartDestinationId", "dbo.Destinations", "Id");
DropColumn("dbo.Trips", "Route");
}
public override void Down()
{
AddColumn("dbo.Trips", "Route", c => c.Geography());
DropForeignKey("dbo.TripLegs", "TripDataId", "dbo.Trips");
DropForeignKey("dbo.TripLegs", "StartDestinationId", "dbo.Destinations");
DropForeignKey("dbo.TripLegs", "EndDestinationId", "dbo.Destinations");
DropForeignKey("dbo.Trips", "StartDestinationId", "dbo.Destinations");
DropForeignKey("dbo.Trips", "EndDestinationId", "dbo.Destinations");
DropIndex("dbo.TripLegs", new[] { "EndDestinationId" });
DropIndex("dbo.TripLegs", new[] { "StartDestinationId" });
DropIndex("dbo.TripLegs", new[] { "TripDataId" });
DropIndex("dbo.Trips", new[] { "EndDestinationId" });
DropIndex("dbo.Trips", new[] { "StartDestinationId" });
DropColumn("dbo.Trips", "EndDestinationId");
DropColumn("dbo.Trips", "StartDestinationId");
DropTable("dbo.TripLegs");
DropTable("dbo.Destinations");
DropTable("dbo.Configurations");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class RenameDestinationToLocation : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(RenameDestinationToLocation));
string IMigrationMetadata.Id
{
get { return "201702120952233_RenameDestinationToLocation"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,44 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class RenameDestinationToLocation : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.Destinations", newName: "Locations");
RenameColumn(table: "dbo.Trips", name: "EndDestinationId", newName: "EndLocationId");
RenameColumn(table: "dbo.Trips", name: "StartDestinationId", newName: "StartLocationId");
RenameColumn(table: "dbo.TripLegs", name: "EndDestinationId", newName: "EndLocationId");
RenameColumn(table: "dbo.TripLegs", name: "StartDestinationId", newName: "StartLocationId");
RenameIndex(table: "dbo.Trips", name: "IX_StartDestinationId", newName: "IX_StartLocationId");
RenameIndex(table: "dbo.Trips", name: "IX_EndDestinationId", newName: "IX_EndLocationId");
RenameIndex(table: "dbo.TripLegs", name: "IX_StartDestinationId", newName: "IX_StartLocationId");
RenameIndex(table: "dbo.TripLegs", name: "IX_EndDestinationId", newName: "IX_EndLocationId");
DropPrimaryKey("dbo.Configurations");
AddColumn("dbo.Configurations", "Id", c => c.String(nullable: false, maxLength: 128));
AddColumn("dbo.Configurations", "Namespace", c => c.String(nullable: false, maxLength: 128));
AddPrimaryKey("dbo.Configurations", new[] { "Id", "Namespace" });
DropColumn("dbo.Configurations", "Key");
}
public override void Down()
{
AddColumn("dbo.Configurations", "Key", c => c.String(nullable: false, maxLength: 128));
DropPrimaryKey("dbo.Configurations");
DropColumn("dbo.Configurations", "Namespace");
DropColumn("dbo.Configurations", "Id");
AddPrimaryKey("dbo.Configurations", "Key");
RenameIndex(table: "dbo.TripLegs", name: "IX_EndLocationId", newName: "IX_EndDestinationId");
RenameIndex(table: "dbo.TripLegs", name: "IX_StartLocationId", newName: "IX_StartDestinationId");
RenameIndex(table: "dbo.Trips", name: "IX_EndLocationId", newName: "IX_EndDestinationId");
RenameIndex(table: "dbo.Trips", name: "IX_StartLocationId", newName: "IX_StartDestinationId");
RenameColumn(table: "dbo.TripLegs", name: "StartLocationId", newName: "StartDestinationId");
RenameColumn(table: "dbo.TripLegs", name: "EndLocationId", newName: "EndDestinationId");
RenameColumn(table: "dbo.Trips", name: "StartLocationId", newName: "StartDestinationId");
RenameColumn(table: "dbo.Trips", name: "EndLocationId", newName: "EndDestinationId");
RenameTable(name: "dbo.Locations", newName: "Destinations");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class CompositeKeyEntityBase : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(CompositeKeyEntityBase));
string IMigrationMetadata.Id
{
get { return "201702121151433_CompositeKeyEntityBase"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,28 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class CompositeKeyEntityBase : DbMigration
{
public override void Up()
{
DropPrimaryKey("dbo.Configurations");
AddColumn("dbo.Configurations", "Key1", c => c.String(nullable: false, maxLength: 128));
AddColumn("dbo.Configurations", "Key2", c => c.String(nullable: false, maxLength: 128));
AddPrimaryKey("dbo.Configurations", new[] { "Key1", "Key2" });
DropColumn("dbo.Configurations", "Id");
DropColumn("dbo.Configurations", "Namespace");
}
public override void Down()
{
AddColumn("dbo.Configurations", "Namespace", c => c.String(nullable: false, maxLength: 128));
AddColumn("dbo.Configurations", "Id", c => c.String(nullable: false, maxLength: 128));
DropPrimaryKey("dbo.Configurations");
DropColumn("dbo.Configurations", "Key2");
DropColumn("dbo.Configurations", "Key1");
AddPrimaryKey("dbo.Configurations", new[] { "Id", "Namespace" });
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class RenameDateTimes : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(RenameDateTimes));
string IMigrationMetadata.Id
{
get { return "201702121521460_RenameDateTimes"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,32 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class RenameDateTimes : DbMigration
{
public override void Up()
{
AddColumn("dbo.Trips", "StartTimeUtc", c => c.DateTime(nullable: false));
AddColumn("dbo.Trips", "EndTimeUtc", c => c.DateTime(nullable: false));
AddColumn("dbo.TripLegs", "StartTimeUtc", c => c.DateTime(nullable: false));
AddColumn("dbo.TripLegs", "EndTimeUtc", c => c.DateTime(nullable: false));
DropColumn("dbo.Trips", "StartTime");
DropColumn("dbo.Trips", "EndTime");
DropColumn("dbo.TripLegs", "StartTime");
DropColumn("dbo.TripLegs", "EndTime");
}
public override void Down()
{
AddColumn("dbo.TripLegs", "EndTime", c => c.DateTime(nullable: false));
AddColumn("dbo.TripLegs", "StartTime", c => c.DateTime(nullable: false));
AddColumn("dbo.Trips", "EndTime", c => c.DateTime(nullable: false));
AddColumn("dbo.Trips", "StartTime", c => c.DateTime(nullable: false));
DropColumn("dbo.TripLegs", "EndTimeUtc");
DropColumn("dbo.TripLegs", "StartTimeUtc");
DropColumn("dbo.Trips", "EndTimeUtc");
DropColumn("dbo.Trips", "StartTimeUtc");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class FixTrackingPointDataTypes : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(FixTrackingPointDataTypes));
string IMigrationMetadata.Id
{
get { return "201702150750048_FixTrackingPointDataTypes"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,26 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class FixTrackingPointDataTypes : DbMigration
{
public override void Up()
{
AddColumn("dbo.TrackingPoints", "LocationProvider", c => c.Int(nullable: false));
AlterColumn("dbo.TrackingPoints", "Accuracy", c => c.Double());
AlterColumn("dbo.TrackingPoints", "Speed", c => c.Double());
AlterColumn("dbo.TrackingPoints", "Altitude", c => c.Double());
AlterColumn("dbo.TrackingPoints", "Bearing", c => c.Double());
}
public override void Down()
{
AlterColumn("dbo.TrackingPoints", "Bearing", c => c.Int());
AlterColumn("dbo.TrackingPoints", "Altitude", c => c.Int());
AlterColumn("dbo.TrackingPoints", "Speed", c => c.Int());
AlterColumn("dbo.TrackingPoints", "Accuracy", c => c.Int());
DropColumn("dbo.TrackingPoints", "LocationProvider");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddDescriptionToConfiguration : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddDescriptionToConfiguration));
string IMigrationMetadata.Id
{
get { return "201703061411479_AddDescriptionToConfiguration"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,18 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddDescriptionToConfiguration : DbMigration
{
public override void Up()
{
AddColumn("dbo.Configurations", "Description", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Configurations", "Description");
}
}
}

Просмотреть файл

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="Target" xml:space="preserve">
<value>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</value>
</data>
<data name="DefaultSchema" xml:space="preserve">
<value>dbo</value>
</data>
</root>

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddAuthorization : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddAuthorization));
string IMigrationMetadata.Id
{
get { return "201704091456404_AddAuthorization"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,46 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddAuthorization : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Roles",
c => new
{
Id = c.Guid(nullable: false),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Users",
c => new
{
Id = c.Guid(nullable: false),
Email = c.String(),
Name = c.String(),
ClaimsId = c.String(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
Role_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Roles", t => t.Role_Id)
.Index(t => t.Role_Id);
}
public override void Down()
{
DropForeignKey("dbo.Users", "Role_Id", "dbo.Roles");
DropIndex("dbo.Users", new[] { "Role_Id" });
DropTable("dbo.Users");
DropTable("dbo.Roles");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddRoleNameColumn : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddRoleNameColumn));
string IMigrationMetadata.Id
{
get { return "201704091527485_AddRoleNameColumn"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,18 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddRoleNameColumn : DbMigration
{
public override void Up()
{
AddColumn("dbo.Roles", "Name", c => c.String());
}
public override void Down()
{
DropColumn("dbo.Roles", "Name");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddConstraintsOnEmailColumn : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddConstraintsOnEmailColumn));
string IMigrationMetadata.Id
{
get { return "201704131512215_AddConstraintsOnEmailColumn"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,20 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddConstraintsOnEmailColumn : DbMigration
{
public override void Up()
{
AlterColumn("dbo.Users", "Email", c => c.String(nullable: false, maxLength: 450));
CreateIndex("dbo.Users", "Email", unique: true);
}
public override void Down()
{
DropIndex("dbo.Users", new[] { "Email" });
AlterColumn("dbo.Users", "Email", c => c.String());
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddGeoFencesAndNotificationUpdates : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddGeoFencesAndNotificationUpdates));
string IMigrationMetadata.Id
{
get { return "201705010937090_AddGeoFencesAndNotificationUpdates"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,53 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddGeoFencesAndNotificationUpdates : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.NotificationUpdates",
c => new
{
Id = c.Int(nullable: false, identity: true),
GeoFenceDataId = c.Int(nullable: false),
AssetDataId = c.String(maxLength: 128),
Status = c.Int(nullable: false),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Assets", t => t.AssetDataId)
.ForeignKey("dbo.GeoFences", t => t.GeoFenceDataId, cascadeDelete: true)
.Index(t => t.GeoFenceDataId)
.Index(t => t.AssetDataId);
CreateTable(
"dbo.GeoFences",
c => new
{
Id = c.Int(nullable: false, identity: true),
Email = c.String(),
FenceType = c.Int(nullable: false),
CooldownInSeconds = c.Long(nullable: false),
Polygon = c.Geography(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropForeignKey("dbo.NotificationUpdates", "GeoFenceDataId", "dbo.GeoFences");
DropForeignKey("dbo.NotificationUpdates", "AssetDataId", "dbo.Assets");
DropIndex("dbo.NotificationUpdates", new[] { "AssetDataId" });
DropIndex("dbo.NotificationUpdates", new[] { "GeoFenceDataId" });
DropTable("dbo.GeoFences");
DropTable("dbo.NotificationUpdates");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddAssetIdsToGeoFence : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddAssetIdsToGeoFence));
string IMigrationMetadata.Id
{
get { return "201705010947149_AddAssetIdsToGeoFence"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,18 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddAssetIdsToGeoFence : DbMigration
{
public override void Up()
{
AddColumn("dbo.GeoFences", "AssetIds", c => c.String());
}
public override void Down()
{
DropColumn("dbo.GeoFences", "AssetIds");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddNameToGeoFenceMakeNonNull : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddNameToGeoFenceMakeNonNull));
string IMigrationMetadata.Id
{
get { return "201705021036277_AddNameToGeoFenceMakeNonNull"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,32 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddNameToGeoFenceMakeNonNull : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.NotificationUpdates", "AssetDataId", "dbo.Assets");
DropIndex("dbo.NotificationUpdates", new[] { "AssetDataId" });
AddColumn("dbo.GeoFences", "Name", c => c.String(nullable: false));
AlterColumn("dbo.NotificationUpdates", "AssetDataId", c => c.String(nullable: false, maxLength: 128));
AlterColumn("dbo.GeoFences", "Email", c => c.String(nullable: false));
AlterColumn("dbo.GeoFences", "AssetIds", c => c.String(nullable: false));
CreateIndex("dbo.NotificationUpdates", "AssetDataId");
AddForeignKey("dbo.NotificationUpdates", "AssetDataId", "dbo.Assets", "Id", cascadeDelete: true);
}
public override void Down()
{
DropForeignKey("dbo.NotificationUpdates", "AssetDataId", "dbo.Assets");
DropIndex("dbo.NotificationUpdates", new[] { "AssetDataId" });
AlterColumn("dbo.GeoFences", "AssetIds", c => c.String());
AlterColumn("dbo.GeoFences", "Email", c => c.String());
AlterColumn("dbo.NotificationUpdates", "AssetDataId", c => c.String(maxLength: 128));
DropColumn("dbo.GeoFences", "Name");
CreateIndex("dbo.NotificationUpdates", "AssetDataId");
AddForeignKey("dbo.NotificationUpdates", "AssetDataId", "dbo.Assets", "Id");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class ModifyGeoFenceAddThroughTable : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(ModifyGeoFenceAddThroughTable));
string IMigrationMetadata.Id
{
get { return "201705031253065_ModifyGeoFenceAddThroughTable"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,46 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class ModifyGeoFenceAddThroughTable : DbMigration
{
public override void Up()
{
RenameTable(name: "dbo.NotificationUpdates", newName: "GeoFenceUpdates");
CreateTable(
"dbo.GeoFenceDataAssetDatas",
c => new
{
GeoFenceData_Id = c.Int(nullable: false),
AssetData_Id = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.GeoFenceData_Id, t.AssetData_Id })
.ForeignKey("dbo.GeoFences", t => t.GeoFenceData_Id, cascadeDelete: true)
.ForeignKey("dbo.Assets", t => t.AssetData_Id, cascadeDelete: true)
.Index(t => t.GeoFenceData_Id)
.Index(t => t.AssetData_Id);
AddColumn("dbo.GeoFences", "Emails", c => c.String(nullable: false));
AddColumn("dbo.GeoFences", "CooldownInMinutes", c => c.Long(nullable: false));
DropColumn("dbo.GeoFences", "Email");
DropColumn("dbo.GeoFences", "CooldownInSeconds");
DropColumn("dbo.GeoFences", "AssetIds");
}
public override void Down()
{
AddColumn("dbo.GeoFences", "AssetIds", c => c.String(nullable: false));
AddColumn("dbo.GeoFences", "CooldownInSeconds", c => c.Long(nullable: false));
AddColumn("dbo.GeoFences", "Email", c => c.String(nullable: false));
DropForeignKey("dbo.GeoFenceDataAssetDatas", "AssetData_Id", "dbo.Assets");
DropForeignKey("dbo.GeoFenceDataAssetDatas", "GeoFenceData_Id", "dbo.GeoFences");
DropIndex("dbo.GeoFenceDataAssetDatas", new[] { "AssetData_Id" });
DropIndex("dbo.GeoFenceDataAssetDatas", new[] { "GeoFenceData_Id" });
DropColumn("dbo.GeoFences", "CooldownInMinutes");
DropColumn("dbo.GeoFences", "Emails");
DropTable("dbo.GeoFenceDataAssetDatas");
RenameTable(name: "dbo.GeoFenceUpdates", newName: "NotificationUpdates");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddAssetsPropertiesTableAndAssetTypeField : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddAssetsPropertiesTableAndAssetTypeField));
string IMigrationMetadata.Id
{
get { return "201708191324100_AddAssetsPropertiesTableAndAssetTypeField"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,43 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddAssetsPropertiesTableAndAssetTypeField : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.AssetProperties",
c => new
{
Id = c.Int(nullable: false, identity: true),
AssetHeight = c.Double(),
AssetWidth = c.Double(),
AssetLength = c.Double(),
AssetWeight = c.Double(),
AssetAxels = c.Int(),
AssetTrailers = c.Int(),
AssetSemi = c.Boolean(),
AssetMaxGradient = c.Double(),
AssetMinTurnRadius = c.Double(),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
AssetId = c.String(maxLength: 128),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.Assets", t => t.AssetId)
.Index(t => t.AssetId);
AddColumn("dbo.Assets", "AssetType", c => c.Int(nullable: false, defaultValue: 0));
}
public override void Down()
{
DropForeignKey("dbo.AssetProperties", "AssetId", "dbo.Assets");
DropIndex("dbo.AssetProperties", new[] { "AssetId" });
DropColumn("dbo.Assets", "AssetType");
DropTable("dbo.AssetProperties");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddLatestPositionColumns : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddLatestPositionColumns));
string IMigrationMetadata.Id
{
get { return "201711091002497_AddLatestPositionColumns"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddLatestPositionColumns : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.TrackingPoints", "AssetId", "dbo.Assets");
DropForeignKey("dbo.TrackingPoints", "TrackingDeviceId", "dbo.TrackingDevices");
AddColumn("dbo.Assets", "LatestPosition_Id", c => c.Int());
AddColumn("dbo.TrackingDevices", "LatestPosition_Id", c => c.Int());
CreateIndex("dbo.Assets", "LatestPosition_Id");
CreateIndex("dbo.TrackingDevices", "LatestPosition_Id");
AddForeignKey("dbo.TrackingDevices", "LatestPosition_Id", "dbo.TrackingPoints", "Id");
AddForeignKey("dbo.Assets", "LatestPosition_Id", "dbo.TrackingPoints", "Id");
AddForeignKey("dbo.TrackingPoints", "AssetId", "dbo.Assets", "Id");
AddForeignKey("dbo.TrackingPoints", "TrackingDeviceId", "dbo.TrackingDevices", "Id");
}
public override void Down()
{
DropForeignKey("dbo.TrackingPoints", "TrackingDeviceId", "dbo.TrackingDevices");
DropForeignKey("dbo.TrackingPoints", "AssetId", "dbo.Assets");
DropForeignKey("dbo.Assets", "LatestPosition_Id", "dbo.TrackingPoints");
DropForeignKey("dbo.TrackingDevices", "LatestPosition_Id", "dbo.TrackingPoints");
DropIndex("dbo.TrackingDevices", new[] { "LatestPosition_Id" });
DropIndex("dbo.Assets", new[] { "LatestPosition_Id" });
DropColumn("dbo.TrackingDevices", "LatestPosition_Id");
DropColumn("dbo.Assets", "LatestPosition_Id");
AddForeignKey("dbo.TrackingPoints", "TrackingDeviceId", "dbo.TrackingDevices", "Id", cascadeDelete: true);
AddForeignKey("dbo.TrackingPoints", "AssetId", "dbo.Assets", "Id", cascadeDelete: true);
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class AddDeploymentId : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(AddDeploymentId));
string IMigrationMetadata.Id
{
get { return "201711100955354_AddDeploymentId"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,27 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class AddDeploymentId : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.DeploymentId",
c => new
{
Id = c.Guid(nullable: false),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
})
.PrimaryKey(t => t.Id);
}
public override void Down()
{
DropTable("dbo.DeploymentId");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,29 @@
// <auto-generated />
namespace Trackable.EntityFramework.Migrations
{
using System.CodeDom.Compiler;
using System.Data.Entity.Migrations;
using System.Data.Entity.Migrations.Infrastructure;
using System.Resources;
[GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")]
public sealed partial class CreateTokenTable : IMigrationMetadata
{
private readonly ResourceManager Resources = new ResourceManager(typeof(CreateTokenTable));
string IMigrationMetadata.Id
{
get { return "201711131016182_CreateTokenTable"; }
}
string IMigrationMetadata.Source
{
get { return null; }
}
string IMigrationMetadata.Target
{
get { return Resources.GetString("Target"); }
}
}
}

Просмотреть файл

@ -0,0 +1,39 @@
namespace Trackable.EntityFramework.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class CreateTokenTable : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Tokens",
c => new
{
Id = c.Guid(nullable: false),
Value = c.String(),
IsActive = c.Boolean(nullable: false),
Deleted = c.Boolean(nullable: false),
CreatedAtTimeUtc = c.DateTime(defaultValueSql: "GETUTCDATE()", nullable: false),
TrackingDevice_Id = c.String(maxLength: 128),
User_Id = c.Guid(),
})
.PrimaryKey(t => t.Id)
.ForeignKey("dbo.TrackingDevices", t => t.TrackingDevice_Id)
.ForeignKey("dbo.Users", t => t.User_Id)
.Index(t => t.TrackingDevice_Id)
.Index(t => t.User_Id);
}
public override void Down()
{
DropForeignKey("dbo.Tokens", "User_Id", "dbo.Users");
DropForeignKey("dbo.Tokens", "TrackingDevice_Id", "dbo.TrackingDevices");
DropIndex("dbo.Tokens", new[] { "User_Id" });
DropIndex("dbo.Tokens", new[] { "TrackingDevice_Id" });
DropTable("dbo.Tokens");
}
}
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -0,0 +1,40 @@
using Trackable.Common;
using System;
using System.Data.Entity.Migrations;
using System.Linq.Expressions;
using System.Linq;
namespace Trackable.EntityFramework.Migrations
{
internal sealed class Configuration : DbMigrationsConfiguration<TrackableDbContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(TrackableDbContext context)
{
foreach (var role in UserRoles.Roles)
{
if (!context.Roles.Any(r => r.Name == role))
{
context.Roles.Add(new RoleData()
{
Id = Guid.NewGuid(),
Name = role
});
}
}
if(context.DeploymentId.Count() < 1)
{
context.DeploymentId.Add(new DeploymentIdData()
{
Id = Guid.NewGuid()
});
}
}
}
}

Просмотреть файл

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("Trackable.EntityFramework")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Trackable.EntityFramework")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("a6b23ff3-82f4-4f29-960c-60c2f09eccad")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Просмотреть файл

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Trackable.EntityFramework
{
[Table("Roles")]
public class RoleData : EntityBase<Guid>
{
public string Name { get; set; }
public ICollection<UserData> Users { get; set; }
}
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше