public void MultidatabaseMappingResolverOnSharedSchemaTest()
        {
            Require.AllFeaturesSupported(ProviderFeatures.Multidatabase);

            var domainConfiguration = DomainConfigurationFactory.Create();

            domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate;
            domainConfiguration.Types.Register(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace);

            domainConfiguration.Databases.Add("DO-Tests-1");
            domainConfiguration.Databases.Add("DO-Tests-2");

            domainConfiguration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).To("DO-Tests-1", "Model1");
            domainConfiguration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).To("DO-Tests-1", "Model2");
            domainConfiguration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).To("DO-Tests-2", "Model1");
            domainConfiguration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).To("DO-Tests-2", "Model2");

            domainConfiguration.DefaultDatabase = "DO-Tests-1";
            domainConfiguration.DefaultSchema   = "Model1";

            var nodeConfiguration = new NodeConfiguration("Additional");

            nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate;
            nodeConfiguration.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-3");
            nodeConfiguration.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-4");
            nodeConfiguration.SchemaMapping.Add("Model1", "Model3");
            nodeConfiguration.SchemaMapping.Add("Model2", "Model4");


            using (var domain = Domain.Build(domainConfiguration)) {
                domain.StorageNodeManager.AddNode(nodeConfiguration);

                var defaultNodeConfig    = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId).Configuration;
                var additionalNodeConfig = domain.StorageNodeManager.GetNode("Additional").Configuration;

                DefaultSchemaInfo defaultSchemaInfo;
                using (var connection = driver.CreateConnection()) {
                    connection.Open();
                    defaultSchemaInfo = driver.GetDefaultSchema(connection);
                }

                var defaultMappingResolver = MappingResolver.Create(domainConfiguration, defaultNodeConfig, defaultSchemaInfo);
                Assert.That(defaultMappingResolver, Is.InstanceOf <MultidatabaseMappingResolver>());

                var additionalMappingResolver = MappingResolver.Create(domainConfiguration, additionalNodeConfig, defaultSchemaInfo);
                Assert.That(additionalMappingResolver, Is.InstanceOf <MultidatabaseMappingResolver>());

                SchemaExtractionResult extractionResult;
                using (var connection = driver.CreateConnection()) {
                    connection.Open();
                    extractionResult = new SchemaExtractionResult(driver.Extract(connection, defaultMappingResolver.GetSchemaTasks()));
                }
                extractionResult.MakeShared();

                var resolverPerNodeMap = new Dictionary <NodeConfiguration, MappingResolver> {
                    { defaultNodeConfig, defaultMappingResolver }, { additionalNodeConfig, additionalMappingResolver }
                };

                var baseDb1  = "DO-Tests-1";
                var baseDb2  = "DO-Tests-2";
                var baseSch1 = "Model1";
                var baseSch2 = "Model2";
                foreach (var pair in resolverPerNodeMap)
                {
                    var nodeConfig = pair.Key;
                    var resolver   = pair.Value;

                    var tasks = resolver.GetSchemaTasks();
                    Assert.That(tasks.Count(), Is.EqualTo(4));
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-1") && t.Schema == nodeConfig.SchemaMapping.Apply("Model1")), Is.True);
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-1") && t.Schema == nodeConfig.SchemaMapping.Apply("Model2")), Is.True);
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-2") && t.Schema == nodeConfig.SchemaMapping.Apply("Model1")), Is.True);
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-2") && t.Schema == nodeConfig.SchemaMapping.Apply("Model2")), Is.True);

                    tasks = resolver.GetMetadataTasks();
                    Assert.That(tasks.Count(), Is.EqualTo(2));
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-1") && t.Schema == nodeConfig.SchemaMapping.Apply("Model1")), Is.True);
                    Assert.That(tasks.Any(t => t.Catalog == nodeConfig.DatabaseMapping.Apply("DO-Tests-2") && t.Schema == nodeConfig.SchemaMapping.Apply("Model1")), Is.True);


                    var fullName = resolver.GetNodeName("TestDb", "TestSchema", "TestEntity1");
                    Assert.That(fullName, Is.EqualTo("TestDb:TestSchema:TestEntity1"));

                    var expectedDatabase = nodeConfig.DatabaseMapping.Apply(baseDb1);
                    var expectedSchema   = nodeConfig.SchemaMapping.Apply(baseSch1);

                    fullName = resolver.GetNodeName("DO-Tests-1", "Model1", "TestEntity1");
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity1", expectedDatabase, expectedSchema)));


                    var table = extractionResult
                                .Catalogs[baseDb1]
                                .Schemas[baseSch1]
                                .Tables["TestEntity1"];
                    fullName         = resolver.GetNodeName(table);
                    expectedDatabase = baseDb1;
                    expectedSchema   = baseSch1;
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity1", expectedDatabase, expectedSchema)));

                    table = extractionResult
                            .Catalogs[baseDb1]
                            .Schemas[baseSch2]
                            .Tables["TestEntity2"];
                    fullName         = resolver.GetNodeName(table);
                    expectedDatabase = baseDb1;
                    expectedSchema   = baseSch2;
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity2", expectedDatabase, expectedSchema)));

                    table = extractionResult
                            .Catalogs[baseDb2]
                            .Schemas[baseSch1]
                            .Tables["TestEntity3"];
                    expectedDatabase = baseDb2;
                    expectedSchema   = baseSch1;
                    fullName         = resolver.GetNodeName(table);
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity3", expectedDatabase, expectedSchema)));

                    var typeinfo = domain.Model.Types[typeof(model.Part1.TestEntity1)];
                    expectedDatabase = nodeConfig.DatabaseMapping.Apply(baseDb1);
                    expectedSchema   = nodeConfig.SchemaMapping.Apply(baseSch1);
                    fullName         = resolver.GetNodeName(typeinfo);
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity1", expectedDatabase, expectedSchema)));

                    var resolveResult = resolver.Resolve(extractionResult, fullName);
                    expectedDatabase = baseDb1;
                    expectedSchema   = baseSch1;
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(resolveResult.Schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));

                    var schema = resolver.ResolveSchema(extractionResult, typeinfo.MappingDatabase, typeinfo.MappingSchema);
                    Assert.That(schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));

                    typeinfo         = domain.Model.Types[typeof(model.Part2.TestEntity2)];
                    expectedDatabase = nodeConfig.DatabaseMapping.Apply(baseDb1);
                    expectedSchema   = nodeConfig.SchemaMapping.Apply(baseSch2);
                    fullName         = resolver.GetNodeName(typeinfo);
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity2", expectedDatabase, expectedSchema)));

                    resolveResult    = resolver.Resolve(extractionResult, fullName);
                    expectedDatabase = baseDb1;
                    expectedSchema   = baseSch2;
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(resolveResult.Schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));

                    schema = resolver.ResolveSchema(extractionResult, typeinfo.MappingDatabase, typeinfo.MappingSchema);
                    Assert.That(schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));


                    typeinfo         = domain.Model.Types[typeof(model.Part3.TestEntity3)];
                    expectedDatabase = nodeConfig.DatabaseMapping.Apply(baseDb2);
                    expectedSchema   = nodeConfig.SchemaMapping.Apply(baseSch1);
                    fullName         = resolver.GetNodeName(typeinfo);
                    Assert.That(fullName, Is.EqualTo(string.Format("{0}:{1}:TestEntity3", expectedDatabase, expectedSchema)));

                    resolveResult    = resolver.Resolve(extractionResult, fullName);
                    expectedDatabase = baseDb2;
                    expectedSchema   = baseSch1;
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(resolveResult.Schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));

                    schema = resolver.ResolveSchema(extractionResult, typeinfo.MappingDatabase, typeinfo.MappingSchema);
                    Assert.That(schema.GetNameInternal(), Is.EqualTo(expectedSchema));
                    Assert.That(schema.Catalog.GetNameInternal(), Is.EqualTo(expectedDatabase));
                }
            }
        }
 public void TestFixtureSetUp()
 {
     driver = TestSqlDriver.Create(DomainConfigurationFactory.Create().ConnectionInfo);
 }
        public void MainTest()
        {
            // Creatign new Domain configuration
            var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations();

            config.UpgradeMode = DomainUpgradeMode.Recreate;
            // Modifying it by registering the persistent types
            config.Types.Register(typeof(User).Assembly, typeof(User).Namespace);
            // And finally building the domain
            var domain = Domain.Build(config);

            Key    dmitriKey;
            int    dmitriId;
            string dmitriKeyString;

            // Opening Session
            using (var session = domain.OpenSession()) {
                // Opening transaction
                using (var transactionScope = session.OpenTransaction()) {
                    // Creating user
                    var dmitri = new User(session)
                    {
                        Name = "Dmitri"
                    };

                    // Storing entity key
                    dmitriKey       = dmitri.Key;
                    dmitriKeyString = dmitriKey.Format();
                    dmitriId        = dmitri.Id;

                    Console.WriteLine("Dmitri's Key (human readable): {0}", dmitriKey);
                    Console.WriteLine("Dmitri's Key (serializable): {0}", dmitriKeyString);
                    Console.WriteLine("Dmitri's Id: {0}", dmitriId);

                    // Marking the transaction scope as completed to commit it
                    transactionScope.Complete();
                }

                // Opening another transaction
                using (var transactionScope = session.OpenTransaction()) {
                    // Parses the serialized key
                    var anotherDimtriKey = Key.Parse(session.Domain, dmitriKeyString);
                    // Keys are equal
                    Assert.AreEqual(dmitriKey, anotherDimtriKey);

                    // Materialization on fetch
                    var dmitri = session.Query.Single <User>(dmitriKey);
                    // Alternative way to do the same
                    var anotherDmitri = session.Query.SingleOrDefault <User>(dmitriKey);
                    Assert.AreSame(dmitri, anotherDmitri);
                    // Fetching by key value(s)
                    anotherDmitri = session.Query.Single <User>(dmitriId);
                    Assert.AreSame(dmitri, anotherDmitri);

                    // Querying the storage using regular LINQ query
                    var query =
                        from user in session.Query.All <User>()
                        where user.Name == "Dmitri"
                        select user;
                    Assert.AreSame(dmitri, query.First());

                    // Querying the storage using compiled query
                    anotherDmitri = session.Query.Execute(qe => // Default caching key is methodof( () => ... )
                                                          from user in session.Query.All <User>()
                                                          where user.Name == "Dmitri"
                                                          select user).First();
                    Assert.AreSame(dmitri, anotherDmitri);

                    // Querying the storage using compiled future scalar query
                    var delayedDmitry1 = session.Query.CreateDelayedQuery(qe => (
                                                                              from user in qe.All <User>()
                                                                              where user.Name == "Dmitri"
                                                                              select user
                                                                              ).FirstOrDefault());
                    var delayedDmitry2 = session.Query.CreateDelayedQuery(qe => (
                                                                              from user in qe.All <User>()
                                                                              where user.Id == dmitriId
                                                                              select user
                                                                              ).First());
                    Assert.AreSame(dmitri, delayedDmitry1.Value); // Both queries are executed at once here
                    Assert.AreSame(dmitri, delayedDmitry2.Value);

                    // Modifying the entity
                    dmitri.Name = "Dmitri Maximov";

                    // Opening new nested transaction
                    using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) {
                        // Removing the entity
                        dmitri.Remove();
                        Assert.IsTrue(dmitri.IsRemoved);
                        AssertEx.Throws <InvalidOperationException>(() => {
                            var dmitryName = dmitri.Name;
                        });
                        // No nestedScope.Complete(), so nested transaction will be rolled back
                    }

                    // Transparent Entity state update
                    Assert.IsFalse(dmitri.IsRemoved);
                    Assert.AreEqual("Dmitri Maximov", dmitri.Name);

                    // Creating few more objects
                    var xtensiveWebPage = new WebPage(session)
                    {
                        Title = "Xtensive Web Site",
                        Url   = "http://www.x-tensive.com"
                    };
                    var alexYakuninBlogPage = new WebPage(session)
                    {
                        Title = "Alex Yakunin's Blog",
                        Url   = "http://blog.alexyakunin.com"
                    };
                    var subsonicPage = new WebPage(session)
                    {
                        Title = "SubSonic project page",
                        Url   = "http://www.subsonicproject.com/"
                    };

                    // Adding the items to EntitySet
                    dmitri.FavoritePages.Add(xtensiveWebPage);
                    dmitri.FavoritePages.Add(alexYakuninBlogPage);
                    dmitri.FavoritePages.Add(subsonicPage);

                    // Removing the item from EntitySet
                    dmitri.FavoritePages.Remove(subsonicPage);

                    // Getting count of items in EntitySet
                    Console.WriteLine("Dmitri's favorite page count: {0}", dmitri.FavoritePages.Count);
                    Assert.AreEqual(2, dmitri.FavoritePages.Count);
                    Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query

                    // Enumerating EntitySet
                    foreach (var page in dmitri.FavoritePages)
                    {
                        Console.WriteLine("Dmitri's favorite page: {0} ({1})", page.Title, page.Url);
                    }

                    // Checking for the containment
                    Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage));
                    Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage));
                    Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage));

                    // Opening new nested transaction
                    using (var nestedScope = session.OpenTransaction(TransactionOpenMode.New)) {
                        // Clearing the EntitySet
                        dmitri.FavoritePages.Clear();
                        Assert.IsFalse(dmitri.FavoritePages.Contains(xtensiveWebPage));
                        Assert.IsFalse(dmitri.FavoritePages.Contains(alexYakuninBlogPage));
                        Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage));
                        Assert.AreEqual(0, dmitri.FavoritePages.Count);
                        Assert.AreEqual(0, dmitri.FavoritePages.Count()); // By query
                        // No nestedScope.Complete(), so nested transaction will be rolled back
                    }

                    // Transparent EntitySet state update
                    Assert.IsTrue(dmitri.FavoritePages.Contains(xtensiveWebPage));
                    Assert.IsTrue(dmitri.FavoritePages.Contains(alexYakuninBlogPage));
                    Assert.IsFalse(dmitri.FavoritePages.Contains(subsonicPage));
                    Assert.AreEqual(2, dmitri.FavoritePages.Count);
                    Assert.AreEqual(2, dmitri.FavoritePages.Count()); // The same, but by LINQ query

                    // Finally, let's query the EntitySet:

                    // Query construction
                    var dmitryFavoriteBlogs =
                        from page in dmitri.FavoritePages
                        where page.Url.ToLower().Contains("blog")
                        select page;

                    // Query execution
                    var dmitryFavoriteBlogList = dmitryFavoriteBlogs.ToList();

                    // Printing the results
                    Console.WriteLine("Dmitri's favorite blog count: {0}", dmitryFavoriteBlogList.Count);
                    foreach (var page in dmitryFavoriteBlogList)
                    {
                        Console.WriteLine("Dmitri's favorite blog: {0} ({1})", page.Title, page.Url);
                    }

                    Assert.IsTrue(dmitryFavoriteBlogList.Contains(alexYakuninBlogPage));
                    Assert.IsFalse(dmitryFavoriteBlogList.Contains(xtensiveWebPage));
                    Assert.AreEqual(1, dmitryFavoriteBlogList.Count);

                    // Marking the transaction scope as completed to commit it
                    transactionScope.Complete();
                }
            }
        }
        public void MultischemaMappingResolverOnSharedSchemaTest()
        {
            Require.AllFeaturesSupported(ProviderFeatures.Multischema);

            var domainConfiguration = DomainConfigurationFactory.Create();

            domainConfiguration.UpgradeMode = DomainUpgradeMode.Recreate;

            domainConfiguration.Types.Register(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace);
            domainConfiguration.Types.Register(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace);

            domainConfiguration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).ToSchema("Model1");
            domainConfiguration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).ToSchema("Model1");
            domainConfiguration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).ToSchema("Model2");
            domainConfiguration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).ToSchema("Model2");

            domainConfiguration.DefaultSchema = "Model1";

            var nodeConfiguration = new NodeConfiguration("Additional");

            nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate;
            nodeConfiguration.SchemaMapping.Add("Model1", "Model3");
            nodeConfiguration.SchemaMapping.Add("Model2", "Model4");

            using (var domain = Domain.Build(domainConfiguration)) {
                domain.StorageNodeManager.AddNode(nodeConfiguration);

                var defaultNodeConfig    = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId).Configuration;
                var additionalNodeConfig = domain.StorageNodeManager.GetNode("Additional").Configuration;

                DefaultSchemaInfo defaultSchemaInfo;
                using (var connection = driver.CreateConnection()) {
                    connection.Open();
                    defaultSchemaInfo = driver.GetDefaultSchema(connection);
                }

                var defaultMappingResolver = MappingResolver.Create(domainConfiguration, defaultNodeConfig, defaultSchemaInfo);
                Assert.That(defaultMappingResolver, Is.InstanceOf <MultischemaMappingResolver>());
                var additionalMappingResolver = MappingResolver.Create(domainConfiguration, additionalNodeConfig, defaultSchemaInfo);
                Assert.That(additionalMappingResolver, Is.InstanceOf <MultischemaMappingResolver>());

                SchemaExtractionResult extractionResult;
                using (var connection = driver.CreateConnection()) {
                    connection.Open();
                    extractionResult = new SchemaExtractionResult(driver.Extract(connection, defaultMappingResolver.GetSchemaTasks()));
                }
                extractionResult.MakeShared();

                var resolverPerNodeMap = new Dictionary <NodeConfiguration, MappingResolver> {
                    { defaultNodeConfig, defaultMappingResolver }, { additionalNodeConfig, additionalMappingResolver }
                };

                foreach (var pair in resolverPerNodeMap)
                {
                    var nodeConfig      = pair.Key;
                    var mappingResolver = pair.Value;

                    Assert.That(mappingResolver, Is.InstanceOf <MultischemaMappingResolver>());
                    var metadataExtactionTasks = mappingResolver.GetMetadataTasks();
                    Assert.That(metadataExtactionTasks.Count(), Is.EqualTo(1));
                    Assert.That(metadataExtactionTasks.First().Catalog, Is.EqualTo(defaultSchemaInfo.Database));
                    Assert.That(metadataExtactionTasks.First().Schema, Is.EqualTo(nodeConfig.SchemaMapping.Apply("Model1")));

                    var schemaExtractionTasks = mappingResolver.GetSchemaTasks();
                    Assert.That(schemaExtractionTasks.Count(), Is.EqualTo(2));
                    Assert.That(schemaExtractionTasks.Any(t => t.Catalog == defaultSchemaInfo.Database && t.Schema == nodeConfig.SchemaMapping.Apply("Model1")), Is.True);
                    Assert.That(schemaExtractionTasks.Any(t => t.Catalog == defaultSchemaInfo.Database && t.Schema == nodeConfig.SchemaMapping.Apply("Model2")), Is.True);

                    var fullName = mappingResolver.GetNodeName("dummy", "SchemaName", "Table1");
                    Assert.That(fullName, Is.EqualTo("SchemaName:Table1"));

                    fullName = mappingResolver.GetNodeName("dummy", "Model1", "Table1");
                    Assert.That(fullName, Is.EqualTo(nodeConfig.SchemaMapping.Apply("Model1") + ":" + "Table1"));

                    var table = extractionResult.Catalogs.First().Schemas["Model1"].Tables["TestEntity1"];
                    fullName = mappingResolver.GetNodeName(table);
                    Assert.That(fullName, Is.EqualTo("Model1" + ":" + "TestEntity1"));

                    table    = extractionResult.Catalogs.First().Schemas["Model2"].Tables["TestEntity4"];
                    fullName = mappingResolver.GetNodeName(table);
                    Assert.That(fullName, Is.EqualTo("Model2" + ":" + "TestEntity4"));

                    var typeInfo = domain.Model.Types[typeof(model.Part1.TestEntity1)];
                    fullName = mappingResolver.GetNodeName(typeInfo);
                    Assert.That(fullName, Is.EqualTo(nodeConfig.SchemaMapping.Apply("Model1") + ":" + "TestEntity1"));

                    var resolveResult = mappingResolver.Resolve(extractionResult, fullName);
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo("Model1"));

                    var schema = mappingResolver.ResolveSchema(extractionResult, typeInfo.MappingDatabase, typeInfo.MappingSchema);
                    Assert.That(schema.GetNameInternal(), Is.EqualTo("Model1"));

                    typeInfo = domain.Model.Types[typeof(model.Part4.TestEntity4)];
                    fullName = mappingResolver.GetNodeName(typeInfo);
                    Assert.That(fullName, Is.EqualTo(nodeConfig.SchemaMapping.Apply("Model2") + ":" + "TestEntity4"));

                    resolveResult = mappingResolver.Resolve(extractionResult, fullName);
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo("Model2"));

                    schema = mappingResolver.ResolveSchema(extractionResult, typeInfo.MappingDatabase, typeInfo.MappingSchema);
                    Assert.That(schema.GetNameInternal(), Is.EqualTo("Model2"));

                    var sequence = typeInfo.Hierarchy.Key.Sequence;
                    fullName = mappingResolver.GetNodeName(sequence);
                    Assert.That(fullName, Is.EqualTo(nodeConfig.SchemaMapping.Apply("Model1") + ":" + sequence.MappingName));

                    resolveResult = mappingResolver.Resolve(extractionResult, fullName);
                    Assert.That(resolveResult.Schema.GetNameInternal(), Is.EqualTo("Model1"));
                }
            }
        }
        public void CurrentSessionTest()
        {
            #region Session sample

            // Creating new Domain configuration
            var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations();
            config.UpgradeMode = DomainUpgradeMode.Recreate;

            // Registering all types in the specified assembly and namespace
            config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace);
            // And finally building the domain
            var domain = Domain.Build(config);

            int personId;
            using (var session = domain.OpenSession()) {
                using (var transactionScope = session.OpenTransaction()) {
                    personId = new Person(session).Id;

                    transactionScope.Complete();
                }
            }

            // Opens the session with default configuration - ServerProfile. Auto actiovation option is disabled.
            using (var session = domain.OpenSession()) {
                using (var transactionScope = session.OpenTransaction()) {
                    // you need to provide session explicitly
                    var newPerson     = new Person(session);
                    var fetchedPerson = session.Query.Single <Person>(personId);

                    Console.WriteLine("Current session is null: {0}", Session.Current == null);
                    Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session == session);
                    Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session == session);

                    transactionScope.Complete();
                }
            }

            // New session configuration with actiovation option enabled.
            var sessionConfiguration = new SessionConfiguration(SessionOptions.AutoActivation | SessionOptions.AutoSaveChanges);
            using (var session = domain.OpenSession(sessionConfiguration)) {
                using (var transactionScope = session.OpenTransaction()) {
                    // you don't need to provide session explicitly. Active session will be used instead.
                    var newPerson     = new Person();
                    var fetchedPerson = session.Query.Single <Person>(personId);

                    Console.WriteLine("Our session is current: {0}", Session.Current == session);
                    Console.WriteLine("New entity is bound to our session: {0}", newPerson.Session == session);
                    Console.WriteLine("Fetched entity is bound to our session: {0}", fetchedPerson.Session == session);

                    transactionScope.Complete();
                }
            }

            #endregion

            using (var session = domain.OpenSession()) {
                using (var transactionScope = session.OpenTransaction()) {
                    var person = new Person(session);
                    person.Name = "Barack Obama";

                    transactionScope.Complete();
                }
            }
        }
Exemple #6
0
        public void MultischemaWithDatabaseSwitchingTest()
        {
            Require.ProviderIs(StorageProvider.SqlServer);

            var masterConnection = BuildConnectionToMaster(DomainConfigurationFactory.Create().ConnectionInfo);
            var configuration    = new DomainConfiguration(masterConnection)
            {
                UpgradeMode   = DomainUpgradeMode.Recreate,
                DefaultSchema = dbo,
                ConnectionInitializationSql = $"USE [{DOTests1Db}]"
            };

            configuration.Types.Register(typeof(part1.TestEntity1));

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1")
                {
                    ConnectionInfo = masterConnection,
                    ConnectionInitializationSql = $"USE [{DOTests1Db}]",
                    UpgradeMode = DomainUpgradeMode.Recreate
                };
                domainCopyNode.SchemaMapping.Add(dbo, dbo);
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2")
                {
                    ConnectionInfo = masterConnection,
                    ConnectionInitializationSql = $"USE [{DOTests2Db}]",
                    UpgradeMode = DomainUpgradeMode.Recreate
                };
                anotherDatabaseNode.SchemaMapping.Add(dbo, dbo);
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var thirdDatabaseNode = new NodeConfiguration("3")
                {
                    ConnectionInfo = masterConnection,
                    ConnectionInitializationSql = $"USE [{DOTests3Db}]",
                    UpgradeMode = DomainUpgradeMode.Recreate
                };
                thirdDatabaseNode.SchemaMapping.Add(dbo, Schema1);
                _ = domain.StorageNodeManager.AddNode(thirdDatabaseNode);
            }

            configuration = new DomainConfiguration(masterConnection)
            {
                DefaultSchema = dbo,
                UpgradeMode   = DomainUpgradeMode.Skip,
                ConnectionInitializationSql = $"USE [{DOTests1Db}]"
            };
            configuration.Types.Register(typeof(part1.TestEntity1));

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1")
                {
                    ConnectionInfo = masterConnection,
                    UpgradeMode    = DomainUpgradeMode.Skip,
                    ConnectionInitializationSql = $"USE [{DOTests1Db}]"
                };
                domainCopyNode.SchemaMapping.Add(dbo, dbo);

                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2")
                {
                    ConnectionInfo = masterConnection,
                    UpgradeMode    = DomainUpgradeMode.Skip,
                    ConnectionInitializationSql = $"USE [{DOTests2Db}]"
                };
                anotherDatabaseNode.SchemaMapping.Add(dbo, dbo);
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var thirdDatabaseNode = new NodeConfiguration("3")
                {
                    ConnectionInfo = masterConnection,
                    UpgradeMode    = DomainUpgradeMode.Skip,
                    ConnectionInitializationSql = $"USE [{DOTests3Db}]"
                };
                thirdDatabaseNode.SchemaMapping.Add(dbo, Schema1);
                _ = domain.StorageNodeManager.AddNode(thirdDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var defaultNode     = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table           = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests2Db));

                var node3 = domain.StorageNodeManager.GetNode("3");
                table = node3.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(Schema1));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests3Db));
            }
        }
        public void AutoTest()
        {
            var config = DomainConfigurationFactory.Create();

            config.Types.Register(typeof(Base));
            config.Types.Register(typeof(Auto));
            config.Types.Register(typeof(AutoInheritor));
            var domain                = Domain.Build(config);
            var autoTypeInfo          = domain.Model.Types[typeof(Auto)];
            var autoInheritorTypeInfo = domain.Model.Types[typeof(AutoInheritor)];

            Assert.AreEqual(1, autoTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(2, autoInheritorTypeInfo.GetVersionColumns().Count);
            using (var session = domain.OpenSession()) {
                var           versions        = new VersionSet();
                var           updatedVersions = new VersionSet();
                Auto          auto;
                AutoInheritor autoInheritor;
                using (VersionCapturer.Attach(session, versions))
                    using (var t = session.OpenTransaction()) {
                        auto = new Auto()
                        {
                            Content = "Content", Tag = "Tag"
                        };
                        autoInheritor = new AutoInheritor()
                        {
                            Content = "Content", Tag = "Tag"
                        };
                        t.Complete();
                    }
                using (VersionCapturer.Attach(session, updatedVersions))
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            auto.Content          = "AnotherContent";
                            auto.Content          = "AnotherContetnCorrect";
                            autoInheritor.Content = "AnotherContent";
                            autoInheritor.Content = "AnotherContetnCorrect";
                            t.Complete();
                        }
                AssertEx.Throws <VersionConflictException>(() => {
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            auto.Tag          = "AnotherTag";
                            autoInheritor.Tag = "AnotherTag";
                            t.Complete();
                        }
                });

                using (VersionValidator.Attach(session, updatedVersions))
                    using (var t = session.OpenTransaction()) {
                        auto.Tag          = "AnotherTag";
                        autoInheritor.Tag = "AnotherTag";
                        t.Complete();
                    }
            }
            var allVersions = new VersionSet();

            using (var session = domain.OpenSession())
                using (VersionCapturer.Attach(session, allVersions))
                    using (VersionValidator.Attach(session, allVersions)) {
                        Auto          auto;
                        AutoInheritor autoInheritor;
                        using (var t = session.OpenTransaction()) {
                            auto = new Auto()
                            {
                                Content = "Content", Tag = "Tag"
                            };
                            autoInheritor = new AutoInheritor()
                            {
                                Content = "Content", Tag = "Tag"
                            };
                            t.Complete();
                        }
                        using (var t = session.OpenTransaction()) {
                            auto.Content          = "AnotherContent";
                            auto.Content          = "AnotherContetnCorrect";
                            autoInheritor.Content = "AnotherContent";
                            autoInheritor.Content = "AnotherContetnCorrect";
                            t.Complete();
                        }

                        using (var t = session.OpenTransaction()) {
                            auto.Tag          = "AnotherTag";
                            autoInheritor.Tag = "AnotherTag";
                            t.Complete();
                        }
                    }
        }
Exemple #8
0
        public void MultischemaWithDatabaseSwitchingTest()
        {
            Require.ProviderIs(StorageProvider.SqlServer);

            var masterConnection = BuildConnectionToMaster(DomainConfigurationFactory.Create().ConnectionInfo);
            var configuration    = new DomainConfiguration(masterConnection);

            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.UpgradeMode   = DomainUpgradeMode.Recreate;
            configuration.DefaultSchema = "dbo";
            configuration.ConnectionInitializationSql = "USE [DO-Tests-1]";

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1");
                domainCopyNode.ConnectionInfo = masterConnection;
                domainCopyNode.ConnectionInitializationSql = "USE [DO-Tests-1]";
                domainCopyNode.SchemaMapping.Add("dbo", "dbo");
                domainCopyNode.UpgradeMode = DomainUpgradeMode.Recreate;
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2");
                anotherDatabaseNode.ConnectionInfo = masterConnection;
                anotherDatabaseNode.ConnectionInitializationSql = "USE [DO-Tests-2]";
                anotherDatabaseNode.SchemaMapping.Add("dbo", "dbo");
                anotherDatabaseNode.UpgradeMode = DomainUpgradeMode.Recreate;
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var thirdDatabaseNode = new NodeConfiguration("3");
                thirdDatabaseNode.ConnectionInfo = masterConnection;
                thirdDatabaseNode.ConnectionInitializationSql = "USE [DO-Tests-3]";
                thirdDatabaseNode.SchemaMapping.Add("dbo", "Model1");
                thirdDatabaseNode.UpgradeMode = DomainUpgradeMode.Recreate;
                _ = domain.StorageNodeManager.AddNode(thirdDatabaseNode);
            }

            configuration = new DomainConfiguration(masterConnection);
            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.DefaultSchema = "dbo";
            configuration.UpgradeMode   = DomainUpgradeMode.Skip;
            configuration.ConnectionInitializationSql = "USE [DO-Tests-1]";
            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1");
                domainCopyNode.ConnectionInfo = masterConnection;
                domainCopyNode.ConnectionInitializationSql = "USE [DO-Tests-1]";
                domainCopyNode.SchemaMapping.Add("dbo", "dbo");
                domainCopyNode.UpgradeMode = DomainUpgradeMode.Skip;
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2");
                anotherDatabaseNode.ConnectionInfo = masterConnection;
                anotherDatabaseNode.ConnectionInitializationSql = "USE [DO-Tests-2]";
                anotherDatabaseNode.SchemaMapping.Add("dbo", "dbo");
                anotherDatabaseNode.UpgradeMode = DomainUpgradeMode.Skip;
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var thirdDatabaseNode = new NodeConfiguration("3");
                thirdDatabaseNode.ConnectionInfo = masterConnection;
                thirdDatabaseNode.ConnectionInitializationSql = "USE [DO-Tests-3]";
                thirdDatabaseNode.SchemaMapping.Add("dbo", "Model1");
                thirdDatabaseNode.UpgradeMode = DomainUpgradeMode.Skip;
                _ = domain.StorageNodeManager.AddNode(thirdDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var defaultNode     = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table           = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-2"));

                var node3 = domain.StorageNodeManager.GetNode("3");
                table = node3.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("Model1"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-3"));
            }
        }
        public void DefaultTest()
        {
            var config = DomainConfigurationFactory.Create();

            config.Types.Register(typeof(Base));
            config.Types.Register(typeof(Default));
            config.Types.Register(typeof(DefaultInheritor));
            var domain                   = Domain.Build(config);
            var defaultTypeInfo          = domain.Model.Types[typeof(Default)];
            var defaultInheritorTypeInfo = domain.Model.Types[typeof(DefaultInheritor)];

            Assert.AreEqual(3, defaultTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(4, defaultInheritorTypeInfo.GetVersionColumns().Count);
            using (var session = domain.OpenSession()) {
                var     versions        = new VersionSet();
                var     updatedVersions = new VersionSet();
                Default @default;
                using (VersionCapturer.Attach(session, versions))
                    using (var t = session.OpenTransaction()) {
                        @default = new Default()
                        {
                            Name = "Name", Tag = "Tag", Version = 1
                        };
                        t.Complete();
                    }
                using (VersionCapturer.Attach(session, updatedVersions))
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            @default.Version = 2;
                            @default.Name    = "AnotherName";
                            @default.Name    = "AnotherNameCorrect";
                            t.Complete();
                        }
                AssertEx.Throws <VersionConflictException>(() => {
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            @default.Tag = "AnotherTag";
                            t.Complete();
                        }
                });

                using (VersionValidator.Attach(session, updatedVersions))
                    using (var t = session.OpenTransaction()) {
                        @default.Tag = "AnotherTag";
                        t.Complete();
                    }
            }
            var allVersions = new VersionSet();

            using (var session = domain.OpenSession())
                using (VersionCapturer.Attach(session, allVersions))
                    using (VersionValidator.Attach(session, allVersions)) {
                        Default @default;
                        using (var t = session.OpenTransaction()) {
                            @default = new Default()
                            {
                                Name = "Name", Tag = "Tag", Version = 1
                            };
                            t.Complete();
                        }

                        using (var t = session.OpenTransaction()) {
                            @default.Version = 2;
                            @default.Name    = "AnotherName";
                            @default.Name    = "AnotherNameCorrect";
                            t.Complete();
                        }

                        using (var t = session.OpenTransaction()) {
                            @default.Tag = "AnotherTag";
                            t.Complete();
                        }
                    }
        }
        public void ManualTest()
        {
            var config = DomainConfigurationFactory.Create();

            config.Types.Register(typeof(Base));
            config.Types.Register(typeof(Manual));
            config.Types.Register(typeof(AnotherManual));
            config.Types.Register(typeof(ManualInheritor));
            config.Types.Register(typeof(AnotherManualInheritor));
            var domain                         = Domain.Build(config);
            var manualTypeInfo                 = domain.Model.Types[typeof(Manual)];
            var anotherManualTypeInfo          = domain.Model.Types[typeof(AnotherManual)];
            var manualInheritorTypeInfo        = domain.Model.Types[typeof(ManualInheritor)];
            var anotherManualInheritorTypeInfo = domain.Model.Types[typeof(AnotherManualInheritor)];

            Assert.AreEqual(1, manualTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(2, anotherManualTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(1, manualInheritorTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(2, anotherManualInheritorTypeInfo.GetVersionColumns().Count);
            using (var session = domain.OpenSession()) {
                var                    versions        = new VersionSet();
                var                    updatedVersions = new VersionSet();
                Manual                 manual;
                ManualInheritor        manualInheritor;
                AnotherManual          anotherManual;
                AnotherManualInheritor anotherManualInheritor;
                using (VersionCapturer.Attach(session, versions))
                    using (var t = session.OpenTransaction()) {
                        manual = new Manual()
                        {
                            Tag = "Tag", Content = "Content", Version = 1
                        };
                        manualInheritor = new ManualInheritor()
                        {
                            Tag = "Tag", Content = "Content", Version = 1, Name = "Name"
                        };
                        anotherManual = new AnotherManual()
                        {
                            Tag = "Tag", Content = "Content", Version = 1, SubVersion = 100
                        };
                        anotherManualInheritor = new AnotherManualInheritor()
                        {
                            Tag = "Tag", Content = "Content", Version = 1, SubVersion = 100, Name = "Name"
                        };
                        t.Complete();
                    }
                using (VersionCapturer.Attach(session, updatedVersions))
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            manual.Version                    = 2;
                            manual.Tag                        = "AnotherTag";
                            manual.Tag                        = "AnotherTagCorrect";
                            manualInheritor.Name              = "AnotherName";
                            manualInheritor.Version           = 2;
                            anotherManual.Tag                 = "AnotherTag";
                            anotherManual.SubVersion          = 200;
                            anotherManualInheritor.Name       = "AnotherName";
                            anotherManualInheritor.SubVersion = 200;
                            t.Complete();
                        }
                AssertEx.Throws <VersionConflictException>(() => {
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            manual.Tag                  = "YetAnotherTag";
                            anotherManual.Tag           = "YetAnotherTag";
                            anotherManual.Version       = 2;
                            manualInheritor.Name        = "YetAnotherName";
                            anotherManualInheritor.Name = "YetAnotherName";
                            t.Complete();
                        }
                });

                using (VersionValidator.Attach(session, updatedVersions))
                    using (var t = session.OpenTransaction()) {
                        manual.Tag                  = "YetAnotherTag";
                        anotherManual.Tag           = "YetAnotherTag";
                        anotherManual.Version       = 2;
                        manualInheritor.Name        = "YetAnotherName";
                        anotherManualInheritor.Name = "YetAnotherName";
                        t.Complete();
                    }
            }
        }
Exemple #11
0
        public async Task MultidatabaseAsyncTest()
        {
            Require.AllFeaturesSupported(ProviderFeatures.Multidatabase);
            var db1DefaultSchemaType = typeof(Database1.Default.TestEntity1);
            var db1Model1SchemaType  = typeof(Database1.Model1.TestEntity2);
            var db1Model2SchemaType  = typeof(Database1.Model2.TestEntity3);

            var db2DefaultSchemaType = typeof(Database2.Default.TestEntity4);
            var db2Model1SchemaType  = typeof(Database2.Model1.TestEntity5);
            var db2Model2SchemaType  = typeof(Database2.Model2.TestEntity6);

            var configuragtion = DomainConfigurationFactory.Create();

            configuragtion.Types.Register(db1DefaultSchemaType);
            configuragtion.Types.Register(db1Model1SchemaType);
            configuragtion.Types.Register(db1Model2SchemaType);

            configuragtion.Types.Register(db2DefaultSchemaType);
            configuragtion.Types.Register(db2Model1SchemaType);
            configuragtion.Types.Register(db2Model2SchemaType);

            configuragtion.Types.Register(typeof(CustomUpgradeHandler));
            configuragtion.Types.Register(typeof(CustomFullTextCatalogNameBuilder));

            configuragtion.DefaultDatabase = "DO-Tests";
            configuragtion.DefaultSchema   = "dbo";

            configuragtion.MappingRules.Map(db1DefaultSchemaType.Assembly, db1DefaultSchemaType.Namespace).To("DO-Tests", "dbo");
            configuragtion.MappingRules.Map(db1Model1SchemaType.Assembly, db1Model1SchemaType.Namespace).To("DO-Tests", "Model1");
            configuragtion.MappingRules.Map(db1Model2SchemaType.Assembly, db1Model2SchemaType.Namespace).To("DO-Tests", "Model2");

            configuragtion.MappingRules.Map(db2DefaultSchemaType.Assembly, db2DefaultSchemaType.Namespace).To("DO-Tests-1", "dbo");
            configuragtion.MappingRules.Map(db2Model1SchemaType.Assembly, db2Model1SchemaType.Namespace).To("DO-Tests-1", "Model1");
            configuragtion.MappingRules.Map(db2Model2SchemaType.Assembly, db2Model2SchemaType.Namespace).To("DO-Tests-1", "Model2");

            configuragtion.UpgradeMode = DomainUpgradeMode.Recreate;

            using (var domain = await Domain.BuildAsync(configuragtion)) {
                var targetStorageModel = domain.Extensions.Get <StorageModel>();

                var db1DefaultSchemaTable = targetStorageModel.Tables["DO-Tests:dbo:TestEntity1"];
                Assert.That(db1DefaultSchemaTable, Is.Not.Null);
                var ftIndex = db1DefaultSchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests_dbo"));

                var db1Model1SchemaTable = targetStorageModel.Tables["DO-Tests:Model1:TestEntity2"];
                ftIndex = db1Model1SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests_Model1"));

                var db1Model2SchemaTable = targetStorageModel.Tables["DO-Tests:Model2:TestEntity3"];
                ftIndex = db1Model2SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests_Model2"));

                var db2DefaultSchemaTable = targetStorageModel.Tables["DO-Tests-1:dbo:TestEntity4"];
                ftIndex = db2DefaultSchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests-1_dbo"));

                var db2Model1SchemaTable = targetStorageModel.Tables["DO-Tests-1:Model1:TestEntity5"];
                ftIndex = db2Model1SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests-1_Model1"));

                var db2Model2SchemaTable = targetStorageModel.Tables["DO-Tests-1:Model2:TestEntity6"];
                ftIndex = db2Model2SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo("DO-Tests-1_Model2"));
            }
        }
Exemple #12
0
        public async Task MultidatabaseAsyncTest()
        {
            Require.AllFeaturesSupported(ProviderFeatures.Multidatabase);
            var db1DefaultSchemaType = typeof(Database1.Default.TestEntity1);
            var db1Model1SchemaType  = typeof(Database1.Model1.TestEntity2);
            var db1Model2SchemaType  = typeof(Database1.Model2.TestEntity3);

            var db2DefaultSchemaType = typeof(Database2.Default.TestEntity4);
            var db2Model1SchemaType  = typeof(Database2.Model1.TestEntity5);
            var db2Model2SchemaType  = typeof(Database2.Model2.TestEntity6);

            var configuragtion = DomainConfigurationFactory.Create();

            configuragtion.Types.Register(db1DefaultSchemaType);
            configuragtion.Types.Register(db1Model1SchemaType);
            configuragtion.Types.Register(db1Model2SchemaType);

            configuragtion.Types.Register(db2DefaultSchemaType);
            configuragtion.Types.Register(db2Model1SchemaType);
            configuragtion.Types.Register(db2Model2SchemaType);

            configuragtion.Types.Register(typeof(CustomUpgradeHandler));
            configuragtion.Types.Register(typeof(CustomFullTextCatalogNameBuilder));

            configuragtion.DefaultDatabase = DOTestsDb;
            configuragtion.DefaultSchema   = dbo;

            configuragtion.MappingRules.Map(db1DefaultSchemaType.Assembly, db1DefaultSchemaType.Namespace)
            .To(DOTestsDb, dbo);
            configuragtion.MappingRules.Map(db1Model1SchemaType.Assembly, db1Model1SchemaType.Namespace)
            .To(DOTestsDb, WellKnownSchemas.Schema1);
            configuragtion.MappingRules.Map(db1Model2SchemaType.Assembly, db1Model2SchemaType.Namespace)
            .To(DOTestsDb, WellKnownSchemas.Schema2);

            configuragtion.MappingRules.Map(db2DefaultSchemaType.Assembly, db2DefaultSchemaType.Namespace)
            .To(DOTests1Db, dbo);
            configuragtion.MappingRules.Map(db2Model1SchemaType.Assembly, db2Model1SchemaType.Namespace)
            .To(DOTests1Db, WellKnownSchemas.Schema1);
            configuragtion.MappingRules.Map(db2Model2SchemaType.Assembly, db2Model2SchemaType.Namespace)
            .To(DOTests1Db, WellKnownSchemas.Schema2);

            configuragtion.UpgradeMode = DomainUpgradeMode.Recreate;

            using (var domain = await Domain.BuildAsync(configuragtion)) {
                var targetStorageModel = domain.Extensions.Get <StorageModel>();

                var db1DefaultSchemaTable = targetStorageModel.Tables[$"{DOTestsDb}:{dbo}:TestEntity1"];
                Assert.That(db1DefaultSchemaTable, Is.Not.Null);
                var ftIndex = db1DefaultSchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTestsDb}_{dbo}"));

                var db1Model1SchemaTable = targetStorageModel.Tables[$"{DOTestsDb}:{Schema1}:TestEntity2"];
                ftIndex = db1Model1SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTestsDb}_{Schema1}"));

                var db1Model2SchemaTable = targetStorageModel.Tables[$"{DOTestsDb}:{Schema2}:TestEntity3"];
                ftIndex = db1Model2SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTestsDb}_{Schema2}"));

                var db2DefaultSchemaTable = targetStorageModel.Tables[$"{DOTests1Db}:{dbo}:TestEntity4"];
                ftIndex = db2DefaultSchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTests1Db}_{dbo}"));

                var db2Model1SchemaTable = targetStorageModel.Tables[$"{DOTests1Db}:{Schema1}:TestEntity5"];
                ftIndex = db2Model1SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTests1Db}_{Schema1}"));

                var db2Model2SchemaTable = targetStorageModel.Tables[$"{DOTests1Db}:{Schema2}:TestEntity6"];
                ftIndex = db2Model2SchemaTable.FullTextIndexes[0];
                Assert.That(ftIndex, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.Not.Null);
                Assert.That(ftIndex.FullTextCatalog, Is.EqualTo($"{DOTests1Db}_{Schema2}"));
            }
        }
 private ConnectionInfo GetAlternativeConnectionInfo()
 {
     return(DomainConfigurationFactory.CreateForConnectionStringTest().ConnectionInfo);
 }
        public void MainTest()
        {
            var config = DomainConfigurationFactory.CreateWithoutSessionConfigurations();

            config.UpgradeMode = DomainUpgradeMode.Recreate;
            config.Types.Register(typeof(Person).Assembly, typeof(Person).Namespace);
            var domain = Domain.Build(config);

            using (var session = domain.OpenSession())
                using (var transactionScope = session.OpenTransaction()) {
                    var employee = new Person(session)
                    {
                        Name = "Employee", Photo = new byte[] { 8, 0 }
                    };
                    var manager = new Person(session)
                    {
                        Name = "Manager", Photo = new byte[] { 8, 0 }
                    };
                    manager.Employees.Add(employee);
                    transactionScope.Complete();
                }

            using (var session = domain.OpenSession())
                using (var transactionScope = session.OpenTransaction()) {
                    var persons = session.Query.All <Person>()
                                  .Prefetch(p => p.Photo)            // Lazy load field
                                  .Prefetch(p => p.Employees         // EntitySet Employees
                                            .Prefetch(e => e.Photo)) // and lazy load field of each of its items
                                  .Prefetch(p => p.Manager);         // Referenced entity
                    foreach (var person in persons)
                    {
                        // some code here...
                    }
                    transactionScope.Complete();
                }

            using (var session = domain.OpenSession())
                using (var transactionScope = session.OpenTransaction()) {
                    var personIds         = session.Query.All <Person>().Select(p => p.Id);
                    var prefetchedPersons = session.Query.Many <Person, int>(personIds)
                                            .Prefetch(p => new { p.Photo, p.Manager })             // Lazy load field and Referenced entity
                                            .Prefetch(p => p.Employees                             // EntitySet Employees
                                                      .Prefetch(e => new { e.Photo, e.Manager })); // and lazy load field and referenced entity of each of its items
                    foreach (var person in prefetchedPersons)
                    {
                        // some code here...
                    }
                    transactionScope.Complete();
                }

            using (var session = domain.OpenSession())
                using (var transactionScope = session.OpenTransaction()) {
                    var persons = session.Query.All <Person>()
                                  .Prefetch(p => p.Photo)                            // Lazy load field
                                  .Prefetch(p => p.Employees.Prefetch(e => e.Photo)) // EntitySet Employees and lazy load field of each of its items with the limit on number of items to be loaded
                                  .Prefetch(p => p.Manager.Photo);                   // Referenced entity and lazy load field for each of them
                    foreach (var person in persons)
                    {
                        Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Photo") == PersistentFieldState.Loaded);
                        Assert.IsTrue(DirectStateAccessor.Get(person).GetFieldState("Manager") == PersistentFieldState.Loaded);
                        if (person.ManagerKey != null)
                        {
                            Assert.IsNotNull(DirectStateAccessor.Get(session)[person.ManagerKey]);
                            Assert.IsTrue(DirectStateAccessor.Get(person.Manager).GetFieldState("Photo") == PersistentFieldState.Loaded);
                        }
                        // some code here...
                    }
                    transactionScope.Complete();
                }
        }
        public void SkipTest()
        {
            var config = DomainConfigurationFactory.Create();

            config.Types.Register(typeof(Base));
            config.Types.Register(typeof(Skip));
            config.Types.Register(typeof(VersionBehavior.Model.Version));
            config.Types.Register(typeof(HasVersion));
            config.Types.Register(typeof(HasSkipVersion));
            var domain                 = Domain.Build(config);
            var skipTypeInfo           = domain.Model.Types[typeof(Skip)];
            var hasVersionTypeInfo     = domain.Model.Types[typeof(HasVersion)];
            var hasSkipVersionTypeInfo = domain.Model.Types[typeof(HasSkipVersion)];

            Assert.AreEqual(2, skipTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(2, hasVersionTypeInfo.GetVersionColumns().Count);
            Assert.AreEqual(2, hasSkipVersionTypeInfo.GetVersionColumns().Count);
            using (var session = domain.OpenSession()) {
                var        versions        = new VersionSet();
                var        updatedVersions = new VersionSet();
                Skip       skip;
                HasVersion hasVersion;
                using (VersionCapturer.Attach(session, versions))
                    using (var t = session.OpenTransaction()) {
                        skip = new Skip()
                        {
                            Content = "Content", Tag = "Tag", Description = "Desription", NotVersion = "NotVersion"
                        };
                        hasVersion = new HasVersion {
                            Content = "Content",
                            Tag     = "Tag",
                            Version = { Major = 10, Minor = 100, Meta = 1000 }
                        };
                        t.Complete();
                    }
                using (VersionCapturer.Attach(session, updatedVersions))
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            skip.Content       = "AnotherContent";
                            skip.Content       = "AnotherContetnCorrect";
                            hasVersion.Content = "AnotherContent";
                            hasVersion.Content = "AnotherContetnCorrect";
                            t.Complete();
                        }
                AssertEx.Throws <VersionConflictException>(() => {
                    using (VersionValidator.Attach(session, versions))
                        using (var t = session.OpenTransaction()) {
                            skip.Tag       = "AnotherTag";
                            hasVersion.Tag = "AnotherTag";
                            t.Complete();
                        }
                });

                using (VersionValidator.Attach(session, updatedVersions))
                    using (var t = session.OpenTransaction()) {
                        skip.Tag       = "AnotherTag";
                        hasVersion.Tag = "AnotherTag";
                        t.Complete();
                    }
            }
            var allVersions = new VersionSet();

            using (var session = domain.OpenSession())
                using (VersionCapturer.Attach(session, allVersions))
                    using (VersionValidator.Attach(session, allVersions)) {
                        Skip       skip;
                        HasVersion hasVersion;
                        using (var t = session.OpenTransaction()) {
                            skip = new Skip()
                            {
                                Content = "Content", Tag = "Tag", Description = "Desription", NotVersion = "NotVersion"
                            };
                            hasVersion = new HasVersion {
                                Content = "Content",
                                Tag     = "Tag",
                                Version = { Major = 10, Minor = 100, Meta = 1000 }
                            };
                            t.Complete();
                        }
                        using (var t = session.OpenTransaction()) {
                            skip.Content       = "AnotherContent";
                            skip.Content       = "AnotherContetnCorrect";
                            hasVersion.Content = "AnotherContent";
                            hasVersion.Content = "AnotherContetnCorrect";
                            t.Complete();
                        }
                        using (var t = session.OpenTransaction()) {
                            skip.Tag       = "AnotherTag";
                            hasVersion.Tag = "AnotherTag";
                            t.Complete();
                        }
                    }
        }
 protected virtual DomainConfiguration BuildConfiguration()
 {
     return(DomainConfigurationFactory.Create());
 }
Exemple #17
0
        private void InitializeSchemas()
        {
            var connectionInfo = DomainConfigurationFactory.Create().ConnectionInfo;

            StorageTestHelper.DemandSchemas(connectionInfo, DefaultSchema, AlternativeSchema);
        }
Exemple #18
0
        public async Task MultidatabaseNodesToDifferentDatabaseSetAsyncTest()
        {
            Require.ProviderIs(StorageProvider.SqlServer);

            var masterConnectionInfo = BuildConnectionToMaster(DomainConfigurationFactory.Create().ConnectionInfo);
            var configuration        = new DomainConfiguration(masterConnectionInfo);

            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.Types.Register(typeof(part2.TestEntity2));
            configuration.UpgradeMode     = DomainUpgradeMode.Recreate;
            configuration.DefaultSchema   = "dbo";
            configuration.DefaultDatabase = "DO-Tests-1";
            configuration.MappingRules.Map(typeof(part1.TestEntity1).Namespace).ToDatabase("DO-Tests-1");
            configuration.MappingRules.Map(typeof(part2.TestEntity2).Namespace).ToDatabase("DO-Tests-2");

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1");
                domainCopyNode.ConnectionInfo = masterConnectionInfo;
                domainCopyNode.SchemaMapping.Add("dbo", "dbo");
                domainCopyNode.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-1");
                domainCopyNode.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-2");
                domainCopyNode.UpgradeMode = DomainUpgradeMode.Recreate;
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2");
                anotherDatabaseNode.ConnectionInfo = masterConnectionInfo;
                anotherDatabaseNode.SchemaMapping.Add("dbo", "dbo");
                anotherDatabaseNode.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-3");
                anotherDatabaseNode.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-4");
                anotherDatabaseNode.UpgradeMode = DomainUpgradeMode.Recreate;
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var testEntity2Type = domain.Model.Types[typeof(part2.TestEntity2)];

                var defaultNode = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table       = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));
                table = defaultNode.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-2"));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));
                table = node1.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-2"));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-3"));
                table = node2.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-4"));
            }

            configuration = new DomainConfiguration(masterConnectionInfo);
            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.Types.Register(typeof(part2.TestEntity2));
            configuration.UpgradeMode     = DomainUpgradeMode.Skip;
            configuration.DefaultSchema   = "dbo";
            configuration.DefaultDatabase = "DO-Tests-1";
            configuration.MappingRules.Map(typeof(part1.TestEntity1).Namespace).ToDatabase("DO-Tests-1");
            configuration.MappingRules.Map(typeof(part2.TestEntity2).Namespace).ToDatabase("DO-Tests-2");

            using (var domain = await Domain.BuildAsync(configuration)) {
                var domainCopyNode = new NodeConfiguration("1");
                domainCopyNode.ConnectionInfo = masterConnectionInfo;
                domainCopyNode.SchemaMapping.Add("dbo", "dbo");
                domainCopyNode.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-1");
                domainCopyNode.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-2");
                domainCopyNode.UpgradeMode = DomainUpgradeMode.Skip;
                _ = domain.StorageNodeManager.AddNodeAsync(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2");
                anotherDatabaseNode.ConnectionInfo = masterConnectionInfo;
                anotherDatabaseNode.SchemaMapping.Add("dbo", "dbo");
                anotherDatabaseNode.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-3");
                anotherDatabaseNode.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-4");
                anotherDatabaseNode.UpgradeMode = DomainUpgradeMode.Skip;
                _ = await domain.StorageNodeManager.AddNodeAsync(anotherDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var testEntity2Type = domain.Model.Types[typeof(part2.TestEntity2)];

                var defaultNode = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table       = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));
                table = defaultNode.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-2"));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-1"));
                table = node1.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-2"));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-3"));
                table = node2.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo("dbo"));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo("DO-Tests-4"));
            }
        }
 public override void TestFixtureSetUp()
 {
     ProviderInfo    = StorageProviderInfo.Instance.Info;
     driver          = TestSqlDriver.Create(DomainConfigurationFactory.Create().ConnectionInfo);
     nodeToSchemaMap = BuildNodeToSchemaMap();
 }
 public override void TestFixtureSetUp()
 {
     base.TestFixtureSetUp();
     driver = TestSqlDriver.Create(DomainConfigurationFactory.Create().ConnectionInfo);
 }
Exemple #21
0
        public void MultidatabaseNodesToDifferentDatabaseSetTest()
        {
            Require.ProviderIs(StorageProvider.SqlServer);

            var masterConnectionInfo = BuildConnectionToMaster(DomainConfigurationFactory.Create().ConnectionInfo);
            var configuration        = new DomainConfiguration(masterConnectionInfo)
            {
                UpgradeMode     = DomainUpgradeMode.Recreate,
                DefaultSchema   = dbo,
                DefaultDatabase = DOTests1Db
            };

            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.Types.Register(typeof(part2.TestEntity2));
            configuration.MappingRules.Map(typeof(part1.TestEntity1).Namespace).ToDatabase(DOTests1Db);
            configuration.MappingRules.Map(typeof(part2.TestEntity2).Namespace).ToDatabase(DOTests2Db);

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1")
                {
                    ConnectionInfo = masterConnectionInfo,
                    UpgradeMode    = DomainUpgradeMode.Recreate
                };
                domainCopyNode.SchemaMapping.Add(dbo, dbo);
                domainCopyNode.DatabaseMapping.Add(DOTests1Db, DOTests1Db);
                domainCopyNode.DatabaseMapping.Add(DOTests2Db, DOTests2Db);
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2")
                {
                    ConnectionInfo = masterConnectionInfo,
                    UpgradeMode    = DomainUpgradeMode.Recreate
                };
                anotherDatabaseNode.SchemaMapping.Add(dbo, dbo);
                anotherDatabaseNode.DatabaseMapping.Add(DOTests1Db, DOTests3Db);
                anotherDatabaseNode.DatabaseMapping.Add(DOTests2Db, DOTests4Db);
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var testEntity2Type = domain.Model.Types[typeof(part2.TestEntity2)];

                var defaultNode = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table       = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));
                table = defaultNode.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests2Db));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));
                table = node1.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests2Db));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests3Db));
                table = node2.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests4Db));
            }

            configuration = new DomainConfiguration(masterConnectionInfo)
            {
                UpgradeMode     = DomainUpgradeMode.Skip,
                DefaultSchema   = dbo,
                DefaultDatabase = DOTests1Db
            };
            configuration.Types.Register(typeof(part1.TestEntity1));
            configuration.Types.Register(typeof(part2.TestEntity2));
            configuration.MappingRules.Map(typeof(part1.TestEntity1).Namespace).ToDatabase(DOTests1Db);
            configuration.MappingRules.Map(typeof(part2.TestEntity2).Namespace).ToDatabase(DOTests2Db);

            using (var domain = Domain.Build(configuration)) {
                var domainCopyNode = new NodeConfiguration("1")
                {
                    ConnectionInfo = masterConnectionInfo,
                    UpgradeMode    = DomainUpgradeMode.Skip
                };
                domainCopyNode.SchemaMapping.Add(dbo, dbo);
                domainCopyNode.DatabaseMapping.Add(DOTests1Db, DOTests1Db);
                domainCopyNode.DatabaseMapping.Add(DOTests2Db, DOTests2Db);
                _ = domain.StorageNodeManager.AddNode(domainCopyNode);

                var anotherDatabaseNode = new NodeConfiguration("2")
                {
                    ConnectionInfo = masterConnectionInfo,
                    UpgradeMode    = DomainUpgradeMode.Skip
                };
                anotherDatabaseNode.SchemaMapping.Add(dbo, dbo);
                anotherDatabaseNode.DatabaseMapping.Add(DOTests1Db, DOTests3Db);
                anotherDatabaseNode.DatabaseMapping.Add(DOTests2Db, DOTests4Db);
                _ = domain.StorageNodeManager.AddNode(anotherDatabaseNode);

                var testEntity1Type = domain.Model.Types[typeof(part1.TestEntity1)];
                var testEntity2Type = domain.Model.Types[typeof(part2.TestEntity2)];

                var defaultNode = domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId);
                var table       = defaultNode.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));
                table = defaultNode.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests2Db));

                var node1 = domain.StorageNodeManager.GetNode("1");
                table = node1.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests1Db));
                table = node1.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests2Db));

                var node2 = domain.StorageNodeManager.GetNode("2");
                table = node2.Mapping[testEntity1Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests3Db));
                table = node2.Mapping[testEntity2Type];
                Assert.That(table.Schema.Name, Is.EqualTo(dbo));
                Assert.That(table.Schema.Catalog.Name, Is.EqualTo(DOTests4Db));
            }
        }