Ejemplo n.º 1
0
        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.");
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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}");
            }
        }
Ejemplo n.º 4
0
        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}");
            }
        }
Ejemplo n.º 5
0
        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);
                }
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 /// <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();
     }
 }
Ejemplo n.º 8
0
        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();
            }
        }
Ejemplo n.º 9
0
        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}");
                }
            }
        }
Ejemplo n.º 10
0
        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);
            }
        }
Ejemplo n.º 11
0
        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);
            }
        }
Ejemplo n.º 12
0
        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);
            }
        }