private static void ConcurrencyTest() { //Concurrency Test var startup = new TenantContextStartup("jsmith", tenantId1); using (var context = new DataContext(startup, connectionString)) { //Select the first item var item = context.Customer.First(); //Simulate the item changing in another context (or user, or machine, etc) ChangeCustomer(startup, item.CustomerId); //The item has been changed now so this object is stale and should throw a concurrency exception item.Name1 = DateTime.Now.Ticks.ToString(); try { //The item has changed so it throws a concurrency exception context.SaveChanges(); Console.WriteLine("You should never see this!"); } catch (Exception ex) { Console.WriteLine("Concurrency failed as expected."); } } }
public void TestSoftDelete() { var startup = new TenantContextStartup("jsmith", TenantA); using (var context = new TestContext(startup, connectionString)) { var startCount = context.Car.Count(); //Create 10 cars and save for (var ii = 1; ii <= 10; ii++) { context.Add(new Car { Name = $"Car {ii}" }); } context.SaveChanges(); //Load all cars from database var carList = context.Car.ToList(); Assert.AreEqual(10 + startCount, carList.Count); //Delete first car and save carList.First().Delete(); context.SaveChanges(); //Select all cars again with no where clause and notice there is 1 less carList = context.Car.ToList(); Assert.AreEqual(9 + startCount, carList.Count); } }
private static void TestSoftDelete() { var startup = new TenantContextStartup("jsmith", tenantId1); using (var context = new DataContext(startup, connectionString)) { //Create 10 cars and save for (var ii = 1; ii <= 10; ii++) { context.Add(new Car { Name = $"Car {ii}" }); } context.SaveChanges(); //Load all cars from database var carList = context.Car.ToList(); Console.WriteLine($"Car count={carList.Count}"); //Delete first car and save carList.First().Delete(); context.SaveChanges(); //Select all cars again with no where clause and notice there is 1 less carList = context.Car.ToList(); Console.WriteLine($"Car count={carList.Count}"); } }
private static void TestCodeManaged() { var rnd = new Random(); var startup = new TenantContextStartup("jsmith", tenantId1); using (var context = new DataContext(startup, connectionString)) { for (var ii = 0; ii < 10; ii++) { //The primary key is not an identity. It must be set in code var newItem = new CodeManagedKey { ID = rnd.Next(10, 999999), Name = $"Hello {DateTime.Now.Ticks}", Data = "hello", }; context.Add(newItem); } context.SaveChanges(); //Test Versioning. It goes up by +1 on each save var item = context.CodeManagedKey.FirstOrDefault(); Console.WriteLine($"Version #: {item.Version}"); item.Name = DateTime.Now.Ticks.ToString(); context.SaveChanges(); Console.WriteLine($"Version #: {item.Version}"); item.Name = DateTime.Now.Ticks.ToString(); context.SaveChanges(); Console.WriteLine($"Version #: {item.Version}"); } }
static void Main(string[] args) { var startup = new TenantContextStartup("jsmith", "qqq"); using (var context = new DataContext(startup, "NO_CONNECTIONSTRING")) { //Force model load context.ChangeTracker.AcceptAllChanges(); var generator = new EFCore.Extensions.DbManagement.InstallerGenerator(); //SQL using (var scriptProvider = new EFCore.Extensions.Scripting.SqlServer.SqlServerGeneration(context)) { var rootPath = @"C:\code\ExtensionsLibrary\EFCoreTest.SqlInstaller\"; generator.Run(rootPath, context, scriptProvider); } //Postgres using (var scriptProvider = new EFCore.Extensions.Scripting.Postgres.PostgresGeneration(context)) { var rootPath = @"C:\code\ExtensionsLibrary\EFCoreTest.PostgresInstaller\"; generator.Run(rootPath, context, scriptProvider); } } }
public void TestTenant1() { const int TenantACount = 13; const int TenantBCount = 8; //Create objects for TenantA var startup = new TenantContextStartup("jsmith", TenantA); using (var context = new TestContext(startup, connectionString)) { //Create cars and save for (var ii = 1; ii <= TenantACount; ii++) { context.Add(new BasicTenant { Name = $"Car {ii}" }); } context.SaveChanges(); } //Create objects for TenantB startup = new TenantContextStartup("jsmith", TenantB); using (var context = new TestContext(startup, connectionString)) { //Create 10 cars and save for (var ii = 1; ii <= TenantBCount; ii++) { context.Add(new BasicTenant { Name = $"Car {ii}" }); } context.SaveChanges(); } //Now select all objects for TenantA startup = new TenantContextStartup("jsmith", TenantA); using (var context = new TestContext(startup, connectionString)) { var list = context.BasicTenant.ToList(); Assert.AreEqual(TenantACount, list.Count); } //Now select all objects for TenantB startup = new TenantContextStartup("jsmith", TenantB); using (var context = new TestContext(startup, connectionString)) { var list = context.BasicTenant.ToList(); Assert.AreEqual(TenantBCount, list.Count); } //Now select all objects for missing tenant startup = new TenantContextStartup("jsmith", "some string"); using (var context = new TestContext(startup, connectionString)) { var list = context.BasicTenant.ToList(); Assert.AreEqual(0, list.Count); } }
/// <summary> /// Helper function to modify a customer to simulate database changes /// </summary> private static void ChangeCustomer(TenantContextStartup startup, Guid id) { //Change a Customer item and save to database using (var context = new DataContext(startup, connectionString)) { context.Customer.First(x => x.CustomerId == id).Name1 = (DateTime.Now.Ticks - 99999).ToString(); context.SaveChanges(); } }
private static void TestBasicTenant() { //Test a simple tenant table. The discriminator field is handled by the framework //The tenant ID is picked up from the "TenantContextStartup" object //The entity "TenantId" should never be set manually. var startup = new TenantContextStartup("jsmith", tenantId1); using (var context = new DataContext(startup, connectionString)) { context.Add(new BasicTenant { Name = $"Hello {DateTime.Now.Ticks}" }); context.SaveChanges(); } }
private static void TestStaticData() { //Test Static data table. This is an immuatable entity that cannot be updated var startup = new TenantContextStartup("jsmith", tenantId1); using (var context = new DataContext(startup, connectionString)) { var list = context.CustomerType.ToList(); Console.WriteLine($"Static data CustomerType has {list.Count} items"); foreach (var item in list) { Console.WriteLine($"Static data CustomerType value={item.CustomerTypeValue}"); } } }
public void TestUnicode() { //This will never fail on memory tests //Must SQL Server or real database to test as memory is always unicode var startup = new TenantContextStartup("jsmith", TenantA); using (var context = new TestContext(startup, connectionString)) { var cc = "汉字"; var newItem = new Car { Name = cc }; context.Add(newItem); context.SaveChanges(); Assert.AreEqual(cc, newItem.Name); } }
public void TestVersion() { var startup = new TenantContextStartup("jsmith", TenantA); using (var context = new TestContext(startup, connectionString)) { var newItem = new CodeManagedKey(); newItem.Name = DateTime.Now.Ticks.ToString(); context.Add(newItem); context.SaveChanges(); Assert.AreEqual(1, newItem.Version); newItem.Name = DateTime.Now.Ticks.ToString(); context.SaveChanges(); Assert.AreEqual(2, newItem.Version); newItem.Name = DateTime.Now.Ticks.ToString(); context.SaveChanges(); Assert.AreEqual(3, newItem.Version); } }
private static void GenerateSqlScript() { //Create an audit tracking configuration var startup = new TenantContextStartup("jsmith", tenantId1); //Create SQL Script using (var context = new DataContext(startup, "NO_CONNECTIONSTRING")) { //Force model load context.ChangeTracker.AcceptAllChanges(); var rootPath = @"C:\code\ExtensionsLibrary\EFCoreTest.SqlInstaller\"; var modelPath = Path.Combine(rootPath, "Models"); var scriptPath = Path.Combine(rootPath, "Migrations"); var createPath = Path.Combine(rootPath, "Create"); if (!Directory.Exists(modelPath)) { Directory.CreateDirectory(modelPath); } if (!Directory.Exists(scriptPath)) { Directory.CreateDirectory(scriptPath); } if (!Directory.Exists(createPath)) { Directory.CreateDirectory(createPath); } var gen = new EFCore.Extensions.Scripting.SqlServer.SqlServerGeneration(context); //Create SQL generation object var sqlCreate = gen.GenerateCreateScript(); //EXECUTE THIS SQL BLOCK TO CREATE DATABASE File.WriteAllText(Path.Combine(createPath, "Create.sql"), sqlCreate); //Load version file var versionFile = Path.Combine(modelPath, "version.json"); var oldVersion = new Versioning(); if (File.Exists(versionFile)) { oldVersion = ScriptingExtensions.FromJson <Versioning>(File.ReadAllText(versionFile)); } var newVersion = new Versioning(oldVersion.ToString()); newVersion.Increment(); File.WriteAllText(versionFile, newVersion.ToJson()); //Load last model (if one) DataModel oldModel = null; var oldVersionFile = Path.Combine(modelPath, oldVersion.GetDiffFileName()) + ".model"; if (File.Exists(oldVersionFile)) { oldModel = ScriptingExtensions.FromJson <DataModel>(File.ReadAllText(oldVersionFile)); } //Diff Script if (oldModel != null) { var sqlDiff = gen.GenerateDiffScript(oldModel, newVersion); File.WriteAllText(Path.Combine(scriptPath, newVersion.GetDiffFileName() + ".sql"), sqlDiff); } //Write model to installer project var modelJson = gen.Model.ToJson(); File.WriteAllText(Path.Combine(modelPath, newVersion.GetDiffFileName()) + ".model", modelJson); } }