From ea5c31404fab41bb31ca7f369da44bc8fcb2d0da Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:40:06 +0500 Subject: [PATCH 01/17] Set storage node right on session creation --- Orm/Xtensive.Orm/Orm/Domain.cs | 25 ++++++++++++++----------- Orm/Xtensive.Orm/Orm/Session.cs | 3 ++- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index e31ccb4314..70a8044d67 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -231,12 +231,14 @@ public Session OpenSession(SessionConfiguration configuration) { ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - return OpenSession(configuration, configuration.Supports(SessionOptions.AutoActivation)); + return OpenSessionInternal(configuration, + null, + configuration.Supports(SessionOptions.AutoActivation)); } - internal Session OpenSession(SessionConfiguration configuration, bool activate) + internal Session OpenSessionInternal(SessionConfiguration configuration, StorageNode storageNode, bool activate) { - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); configuration.Lock(true); if (isDebugEventLoggingEnabled) { @@ -244,7 +246,6 @@ internal Session OpenSession(SessionConfiguration configuration, bool activate) } Session session; - if (SingleConnection!=null) { // Ensure that we check shared connection availability // and acquire connection atomically. @@ -252,12 +253,12 @@ internal Session OpenSession(SessionConfiguration configuration, bool activate) if (singleConnectionOwner!=null) throw new InvalidOperationException(string.Format( Strings.ExSessionXStillUsesSingleAvailableConnection, singleConnectionOwner)); - session = new Session(this, configuration, activate); + session = new Session(this, storageNode, configuration, activate); singleConnectionOwner = session; } } else - session = new Session(this, configuration, activate); + session = new Session(this, storageNode, configuration, activate); NotifySessionOpen(session); return session; @@ -372,12 +373,14 @@ public Task OpenSessionAsync(SessionConfiguration configuration) /// public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken) { - return OpenSessionInternalAsync(configuration, configuration.Supports(SessionOptions.AutoActivation), cancellationToken); + return OpenSessionInternalAsync(configuration, null, + configuration.Supports(SessionOptions.AutoActivation), cancellationToken); } - internal async Task OpenSessionInternalAsync(SessionConfiguration configuration, bool activate, CancellationToken cancellationToken) + internal async Task OpenSessionInternalAsync(SessionConfiguration configuration, StorageNode storageNode, bool activate, CancellationToken cancellationToken) { - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + configuration.Lock(true); if (isDebugEventLoggingEnabled) { @@ -392,7 +395,7 @@ internal async Task OpenSessionInternalAsync(SessionConfiguration confi if (singleConnectionOwner!=null) throw new InvalidOperationException(string.Format( Strings.ExSessionXStillUsesSingleAvailableConnection, singleConnectionOwner)); - session = new Session(this, configuration, false); + session = new Session(this, storageNode, configuration, false); singleConnectionOwner = session; } } @@ -400,7 +403,7 @@ internal async Task OpenSessionInternalAsync(SessionConfiguration confi // DO NOT make session active right from constructor. // That would make session accessible for user before // connection become opened. - session = new Session(this, configuration, false); + session = new Session(this, storageNode, configuration, false); try { await ((SqlSessionHandler)session.Handler).OpenConnectionAsync(cancellationToken).ContinueWith((t) => { if (activate) diff --git a/Orm/Xtensive.Orm/Orm/Session.cs b/Orm/Xtensive.Orm/Orm/Session.cs index 5f9fa6815b..20144c1378 100644 --- a/Orm/Xtensive.Orm/Orm/Session.cs +++ b/Orm/Xtensive.Orm/Orm/Session.cs @@ -506,7 +506,7 @@ private SessionHandler CreateSessionHandler() // Constructors - internal Session(Domain domain, SessionConfiguration configuration, bool activate) + internal Session(Domain domain, StorageNode selectedStorageNode, SessionConfiguration configuration, bool activate) : base(domain) { Guid = Guid.NewGuid(); @@ -519,6 +519,7 @@ internal Session(Domain domain, SessionConfiguration configuration, bool activat identifier = Interlocked.Increment(ref lastUsedIdentifier); CommandTimeout = configuration.DefaultCommandTimeout; allowSwitching = configuration.Supports(SessionOptions.AllowSwitching); + storageNode = selectedStorageNode; // Handlers Handlers = domain.Handlers; From 0bfaefa374466e14977a70a88bdd4fd55e37bedb Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:41:31 +0500 Subject: [PATCH 02/17] Introduces new node selection --- Orm/Xtensive.Orm/Orm/Domain.cs | 26 ++++- .../Orm/Interfaces/ISelectedStorageNode.cs | 97 +++++++++++++++++++ .../Orm/Internals/SelectedStorageNode.cs | 76 +++++++++++++++ 3 files changed, 196 insertions(+), 3 deletions(-) create mode 100644 Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs create mode 100644 Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index 70a8044d67..4e49d08406 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2007-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Dmitri Maximov // Created: 2007.08.03 @@ -15,6 +15,7 @@ using Xtensive.Core; using Xtensive.IoC; using Xtensive.Orm.Configuration; +using Xtensive.Orm.Interfaces; using Xtensive.Orm.Internals; using Xtensive.Orm.Internals.Prefetch; using Xtensive.Orm.Linq; @@ -104,6 +105,25 @@ public static Domain Demand() /// public StorageNodeManager StorageNodeManager { get; private set; } + /// + /// Selects storage node. + /// + /// Node identifier. + /// Node selection allowing storage node dependant operations. + /// /// + /// using (var session = Domain.SelectStorageNode(nodeId).OpenSession()) { + /// // work with persistent objects here. + /// } + /// + /// with given identifier does not exist. + public ISelectedStorageNode SelectStorageNode([NotNull]string storageNodeId) + { + var node = StorageNodeManager.GetNode(storageNodeId); + if (node == null) { + throw new ArgumentException(string.Format(Strings.ExStorageNodeWithIdXIsNotFound, storageNodeId)); + } + return new SelectedStorageNode(this, node); + } #region Private / internal members diff --git a/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs b/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs new file mode 100644 index 0000000000..2e3ff5bfe9 --- /dev/null +++ b/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs @@ -0,0 +1,97 @@ +using System.Threading; +using System.Threading.Tasks; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; + +namespace Xtensive.Orm.Interfaces +{ + /// + /// Defindes -dependant operations. + /// + public interface ISelectedStorageNode + { + /// + /// Opens new with default . + /// + /// + /// New object. + /// + /// + /// using (var session = domain.SelectStorageNode(nodeId).OpenSession()) { + /// // work with persistent objects here. + /// } + /// + /// + Session OpenSession(); + + /// + /// Opens new of specified . + /// + /// The type of session. + /// + /// New object. + /// + /// + /// using (var session = domain.SelectStorageNode(nodeId).OpenSession(sessionType)) { + /// // work with persistent objects here. + /// } + /// + Session OpenSession(SessionType type); + + /// + /// Opens new with specified . + /// + /// The session configuration. + /// + /// New object. + /// + /// + /// using (var session = domain.SelectStorageNode(nodeId).OpenSession(configuration)) { + /// // work with persistent objects here + /// } + /// + /// + Session OpenSession(SessionConfiguration configuration); + + /// + /// Asynchronously opens new with default . + /// + /// A task representing the asynchronous operation. + /// + /// /// var ctSource = new CancellationTokenSource(); + /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(ctSource.Token)) { + /// // work with persistent objects here. + /// } + /// + /// + Task OpenSessionAsync(CancellationToken cancellationToken = default); + + /// + /// Asynchronously opens new of specified asynchronously. + /// + /// The type of session. + /// A task representing the asynchronous operation. + /// + /// var ctSource = new CancellationTokenSource(); + /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(sessionType, ctSource.Token)) { + /// // work with persistent objects here. + /// } + /// + Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default); + + /// + /// Opens new with specified asynchronously. + /// + /// The session configuration. + /// The token to monitor for cancellation requests. + /// A task representing the asynchronous operation. + /// + /// var ctSource = new CancellationTokenSource(); + /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(configuration, ctSource.Token)) { + /// // work with persistent objects here + /// } + /// + /// + Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default); + } +} diff --git a/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs b/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs new file mode 100644 index 0000000000..71a7e37baa --- /dev/null +++ b/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Xtensive.Core; +using Xtensive.Orm; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Interfaces; + +namespace Xtensive.Orm.Internals +{ + internal sealed class SelectedStorageNode : ISelectedStorageNode + { + private readonly Domain domain; + private readonly StorageNode storageNode; + + /// + public Session OpenSession() + { + return OpenSession(domain.Configuration.Sessions.Default); + } + + /// + public Session OpenSession(SessionType type) + { + return type switch { + SessionType.User => OpenSession(domain.Configuration.Sessions.Default), + SessionType.System => OpenSession(domain.Configuration.Sessions.System), + SessionType.KeyGenerator => OpenSession(domain.Configuration.Sessions.KeyGenerator), + SessionType.Service => OpenSession(domain.Configuration.Sessions.Service), + _ => throw new ArgumentOutOfRangeException("type"), + }; + } + + /// + public Session OpenSession(SessionConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + return domain.OpenSessionInternal(configuration, storageNode, configuration.Supports(SessionOptions.AutoActivation)); + } + + /// + public Task OpenSessionAsync(CancellationToken cancellationToken = default) => + OpenSessionAsync(domain.Configuration.Sessions.Default, cancellationToken); + + /// + public Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default) + { + return type switch { + SessionType.User => OpenSessionAsync(domain.Configuration.Sessions.Default), + SessionType.System => OpenSessionAsync(domain.Configuration.Sessions.System), + SessionType.KeyGenerator => OpenSessionAsync(domain.Configuration.Sessions.KeyGenerator), + SessionType.Service => OpenSessionAsync(domain.Configuration.Sessions.Service), + _ => throw new ArgumentOutOfRangeException("type"), + }; + } + + /// + public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + + return domain.OpenSessionInternalAsync(configuration, + storageNode, + configuration.Supports(SessionOptions.AllowSwitching), + cancellationToken); + } + + public SelectedStorageNode(Domain domain, StorageNode storageNode) + { + this.domain = domain; + this.storageNode = storageNode; + } + } +} From 0711d85c8d3a92c908e4172b118875f17701d2eb Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:42:19 +0500 Subject: [PATCH 03/17] Marks old Session.SelectStorageNode method as obsolete --- Orm/Xtensive.Orm/Orm/Session.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Orm/Xtensive.Orm/Orm/Session.cs b/Orm/Xtensive.Orm/Orm/Session.cs index 20144c1378..99609b65d5 100644 --- a/Orm/Xtensive.Orm/Orm/Session.cs +++ b/Orm/Xtensive.Orm/Orm/Session.cs @@ -437,6 +437,7 @@ VersionSet IVersionSetProvider.CreateVersionSet(IEnumerable keys) /// Selects storage node identifier by . /// /// Node identifier. + [Obsolete("Use Domain.SelectStorageNode(nodeId) instead")] public void SelectStorageNode([NotNull] string nodeId) { ArgumentValidator.EnsureArgumentNotNull(nodeId, "nodeId"); From 1c510b18fa99af7b0b2846c43cc586661b9388d0 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:43:34 +0500 Subject: [PATCH 04/17] Completely removes obsolete static Session.Open methods --- Orm/Xtensive.Orm/Orm/Session.Open.cs | 168 --------------------------- 1 file changed, 168 deletions(-) delete mode 100644 Orm/Xtensive.Orm/Orm/Session.Open.cs diff --git a/Orm/Xtensive.Orm/Orm/Session.Open.cs b/Orm/Xtensive.Orm/Orm/Session.Open.cs deleted file mode 100644 index d8104b9d82..0000000000 --- a/Orm/Xtensive.Orm/Orm/Session.Open.cs +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. -// Created by: Denis Krjuchkov -// Created: 2009.12.11 - -using System; -using Xtensive.Core; -using Xtensive.Orm.Configuration; - -namespace Xtensive.Orm -{ - partial class Session - { - /// - /// Opens new with default . - /// - /// The domain. - /// - /// New object. - /// - /// - /// using (var session = Domain.OpenSession()) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property when flag is set for , - /// // or the session is activate explicitely through . - /// } - /// - /// - [Obsolete("Use Domain.OpenSession() method instead")] - public static Session Open(Domain domain) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - - return domain.OpenSession(); - } - - /// - /// Opens new with default . - /// - /// The domain. - /// Determines whether created session should be activated or not. - /// - /// New object. - /// - /// - /// using (var session = domain.OpenSession(false)) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property when flag is set for , - /// // or the session is activate explicitely through . - /// } - /// - /// - [Obsolete("Use Activate() method to activate the session.")] - public static Session Open(Domain domain, bool activate) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - return Open(domain, domain.Configuration.Sessions.Default, activate); - } - - /// - /// Opens new of specified . - /// - /// The domain. - /// The type of session. - /// - /// New object. - /// - /// - /// using (var session = domain.OpenSession(sessionType)) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property when flag is set for , - /// // or the session is activate explicitely through . - /// } - /// - [Obsolete("Use Domain.OpenSession(SessionType type) method instead")] - public static Session Open(Domain domain, SessionType type) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - - return domain.OpenSession(type); - } - - /// - /// Opens new of specified . - /// - /// The domain. - /// The type of session. - /// Determines whether created session should be activated or not. - /// - /// New object. - /// - /// - /// using (domain.OpenSession(sessionType, true)) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property - /// } - /// - [Obsolete("Use Activate() method to activate the session.")] - public static Session Open(Domain domain, SessionType type, bool activate) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - - switch (type) { - case SessionType.User: - return Open(domain, domain.Configuration.Sessions.Default, activate); - case SessionType.System: - return Open(domain, domain.Configuration.Sessions.System, activate); - case SessionType.KeyGenerator: - return Open(domain, domain.Configuration.Sessions.KeyGenerator, activate); - case SessionType.Service: - return Open(domain, domain.Configuration.Sessions.Service, activate); - default: - throw new ArgumentOutOfRangeException("type"); - } - } - - /// - /// Opens new with specified . - /// - /// The domain. - /// The session configuration. - /// - /// New object. - /// - /// - /// using (var session = domain.OpenSession(configuration)) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property when flag is set for , - /// // or the session is activate explicitely through . - /// } - /// - /// - [Obsolete("Use Domain.OpenSession(SessionConfiguration configuration) method instead")] - public static Session Open(Domain domain, SessionConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - - return domain.OpenSession(configuration); - } - - /// - /// Opens new with specified . - /// - /// The domain. - /// The session configuration. - /// Determines whether created session should be activated or not. - /// - /// New object. - /// - /// - /// using (domain.OpenSession(sessionConfiguration, false)) { - /// // work with persistent objects here - /// // Session is available through static Session.Current property - /// } - /// - /// - [Obsolete("Use Activate() method to activate the session.")] - public static Session Open(Domain domain, SessionConfiguration configuration, bool activate) - { - ArgumentValidator.EnsureArgumentNotNull(domain, "domain"); - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - - return domain.OpenSession(configuration, activate); - } - } -} \ No newline at end of file From 84dda267e58eb2dd7975c89ca2f7bb37b38d583c Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:47:04 +0500 Subject: [PATCH 05/17] StorageDriver: connection info and init sql values are based on storage node --- .../Orm/Providers/StorageDriver.Operations.cs | 29 +++++++++++++++---- Orm/Xtensive.Orm/Orm/Session.cs | 6 ++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs index 643bd7815e..4b9a576287 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs @@ -44,12 +44,15 @@ public SqlConnection CreateConnection(Session session) } var sessionConfiguration = GetConfiguration(session); - if (sessionConfiguration.ConnectionInfo!=null) - connection.ConnectionInfo = sessionConfiguration.ConnectionInfo; connection.CommandTimeout = sessionConfiguration.DefaultCommandTimeout; + var connectionInfo = GetConnectionInfo(session) ?? sessionConfiguration.ConnectionInfo; + if (connectionInfo != null) { + connection.ConnectionInfo = connectionInfo; + } - if (!string.IsNullOrEmpty(configuration.ConnectionInitializationSql)) - SetInitializationSql(connection, configuration.ConnectionInitializationSql); + var connectionInitializationSql = GetInitializationSql(session) ?? configuration.ConnectionInitializationSql; + if (!string.IsNullOrEmpty(connectionInitializationSql)) + SetInitializationSql(connection, connectionInitializationSql); return connection; } @@ -339,7 +342,23 @@ private void SetInitializationSql(SqlConnection connection, string script) private SessionConfiguration GetConfiguration(Session session) { - return session!=null ? session.Configuration : configuration.Sessions.System; + return session != null ? session.Configuration : configuration.Sessions.System; + } + + private ConnectionInfo GetConnectionInfo(Session session) + { + return session == null + ? null + : session.GetStorageNodeInternal()?.Configuration.ConnectionInfo + ?? session.Configuration.ConnectionInfo; + } + + private string GetInitializationSql(Session session) + { + return session == null || session.GetStorageNodeInternal() == null + || string.IsNullOrEmpty(session.GetStorageNodeInternal().Configuration.ConnectionInitializationSql) + ? null + : session.StorageNode.Configuration.ConnectionInitializationSql; } } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm/Orm/Session.cs b/Orm/Xtensive.Orm/Orm/Session.cs index 99609b65d5..1f4464af3e 100644 --- a/Orm/Xtensive.Orm/Orm/Session.cs +++ b/Orm/Xtensive.Orm/Orm/Session.cs @@ -302,6 +302,12 @@ internal void SetStorageNode(StorageNode node) storageNode = node; } + // gets node directly + internal StorageNode GetStorageNodeInternal() + { + return storageNode; + } + public ExecutableProvider Compile(CompilableProvider provider) { return CompilationService.Compile(provider, CompilationService.CreateConfiguration(this)); From c42f38471951bfacdc51ad1af0e5fb364b366f64 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:47:54 +0500 Subject: [PATCH 06/17] Removes unused ctor parameter --- Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs | 5 ++--- Orm/Xtensive.Orm/Orm/Domain.cs | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs index 1a953dd7c9..9e8fa11743 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs @@ -56,12 +56,11 @@ private void CreateDomain() var useSingleConnection = services.ProviderInfo.Supports(ProviderFeatures.SingleConnection) && context.BuilderConfiguration.Stage==UpgradeStage.Final; - + context.Domain = new Domain( context.Configuration, context.BuilderConfiguration.UpgradeContextCookie, - useSingleConnection ? services.Connection : null, - context.DefaultSchemaInfo); + useSingleConnection ? services.Connection : null); } } diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index 4e49d08406..b4a2ac4d69 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -461,7 +461,7 @@ public static Domain Build(DomainConfiguration configuration) // Constructors - internal Domain(DomainConfiguration configuration, object upgradeContextCookie, SqlConnection singleConnection, DefaultSchemaInfo defaultSchemaInfo) + internal Domain(DomainConfiguration configuration, object upgradeContextCookie, SqlConnection singleConnection) { Configuration = configuration; Handlers = new HandlerAccessor(this); From 94aabd376cc6f6fce80f3ec43f30015556b3de2e Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 15 Oct 2020 20:48:52 +0500 Subject: [PATCH 07/17] Test for obsolete storage node selection --- .../ObsoleteSelectStorageNodeTest.cs | 154 ++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs new file mode 100644 index 0000000000..ddbd778404 --- /dev/null +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Tests.Storage.Multinode.ObsoleteSelectStorageNodeTestModel; + +namespace Xtensive.Orm.Tests.Storage.Multinode.ObsoleteSelectStorageNodeTestModel +{ + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + + [Field] + public string NodeTag { get; set; } + + public TestEntity(Session session) + :base(session) + { + } + } +} + +namespace Xtensive.Orm.Tests.Storage.Multinode +{ + //should be removed with the obsolete method + public class ObsoleteSelectStorageNodeTest : AutoBuildTest + { + private const string AdditionalNodeName = "Additional"; + private const string DefaultNodeTag = ""; + private const string AdditionalNodeTag = ""; + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override DomainConfiguration BuildConfiguration() + { + var configuration = base.BuildConfiguration(); + configuration.Types.Register(typeof(TestEntity)); + configuration.UpgradeMode = DomainUpgradeMode.Recreate; + configuration.DefaultSchema = "dbo"; + return configuration; + } + + protected override Domain BuildDomain(DomainConfiguration configuration) + { + var domain = base.BuildDomain(configuration); + var nodeConfig = new NodeConfiguration(AdditionalNodeName) { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfig.SchemaMapping.Add("dbo", "Model1"); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + return domain; + } + + protected override void PopulateData() + { + var defaultNodeSelection = Domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var nodeSession = defaultNodeSelection.OpenSession()) + using (var tx = nodeSession.OpenTransaction()) { + _ = new TestEntity(nodeSession) { NodeTag = DefaultNodeTag }; + _ = new TestEntity(nodeSession) { NodeTag = DefaultNodeTag }; + _ = new TestEntity(nodeSession) { NodeTag = DefaultNodeTag }; + tx.Complete(); + } + + var additonalNodeSelection = Domain.SelectStorageNode(AdditionalNodeName); + using (var nodeSession = additonalNodeSelection.OpenSession()) + using (var tx = nodeSession.OpenTransaction()) { + _ = new TestEntity(nodeSession) { NodeTag = AdditionalNodeTag }; + _ = new TestEntity(nodeSession) { NodeTag = AdditionalNodeTag }; + _ = new TestEntity(nodeSession) { NodeTag = AdditionalNodeTag }; + tx.Complete(); + } + + } +#pragma warning disable CS0618 // Type or member is obsolete + + [Test] + public void SelectExistingNodeTest() + { + using (var session = Domain.OpenSession()) { + session.SelectStorageNode(WellKnown.DefaultNodeId); + using(var tx = session.OpenTransaction()) { + var count = 0; + foreach(var item in session.Query.All()) { + Assert.That(item.NodeTag, Is.EqualTo(DefaultNodeTag)); + count++; + } + Assert.That(count, Is.GreaterThan(0)); + } + } + + using (var session = Domain.OpenSession()) { + session.SelectStorageNode(AdditionalNodeName); + using (var tx = session.OpenTransaction()) { + var count = 0; + foreach (var item in session.Query.All()) { + Assert.That(item.NodeTag, Is.EqualTo(AdditionalNodeTag)); + count++; + } + Assert.That(count, Is.GreaterThan(0)); + } + } + } + + [Test] + public void SelectNonExistingNodeTest() + { + using (var session = Domain.OpenSession()) { + _ = Assert.Throws(() => session.SelectStorageNode(WellKnown.DefaultNodeId + "does not exist")); + } + } + + [Test] + public void ReSelectNodeTest() + { + using (var session = Domain.OpenSession()) { + session.SelectStorageNode(WellKnown.DefaultNodeId); + _ = Assert.Throws(() => session.SelectStorageNode(WellKnown.DefaultNodeId)); + } + + using (var session = Domain.OpenSession()) { + session.SelectStorageNode(AdditionalNodeName); + + _ = Assert.Throws(() => session.SelectStorageNode(AdditionalNodeName)); + } + } + + [Test] + public void SessionWithoutSelectedNodeTest() + { + using (var session = Domain.OpenSession()) { + Assert.That(session.GetStorageNodeInternal(), Is.Null); + using (var tx = session.OpenTransaction()) { + var count = 0; + foreach (var item in session.Query.All()) { + Assert.That(item.NodeTag, Is.EqualTo(DefaultNodeTag)); + count++; + } + Assert.That(count, Is.GreaterThan(0)); + } + Assert.That(session.GetStorageNodeInternal(), Is.Not.Null); + Assert.That(session.GetStorageNodeInternal().Id, Is.EqualTo(WellKnown.DefaultNodeId)); + } + } + + +#pragma warning restore CS0618 // Type or member is obsolete + } +} From 8b3e61a9b706ff069d841a301155d580918d4d21 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Fri, 16 Oct 2020 21:40:53 +0500 Subject: [PATCH 08/17] Applies new node selection method to tests --- .../MultipleNodesTest.cs | 288 +++++----- ...eMappingCachingInMaterializationContext.cs | 101 ++-- ...0647_StoredDomainModelMappingsUpdateBug.cs | 61 ++- .../Storage/Multinode/DynamicTypeIdTest.cs | 223 ++++---- .../Storage/Multinode/QueryCachingTest.cs | 514 +++++++++--------- .../Multinode/StandardMultinodeTest.cs | 54 +- .../MultidatabaseEntityManipulationTest.cs | 38 +- .../MultischemaEntityManipulationTest.cs | 38 +- .../SimpleEntityManipulationTest.cs | 268 +++++---- .../SchemaSharing/KeyGenerator/SimpleTest.cs | 60 +- .../HugeModelUpgrade/DatabasePerNodeTest.cs | 8 +- .../HugeModelUpgrade/MappedTypesNodesTest.cs | 24 +- .../HugeModelUpgrade/SchemaPerNodeTest.cs | 15 +- .../TwoDatabasesPerNodeTest.cs | 24 +- .../HugeModelUpgrade/TwoSchemasPerNodeTest.cs | 24 +- .../Upgrade/NewSkip/SingleDatabaseNodeTest.cs | 293 +++++----- .../NewSkip/SingleSchemaNodeBuildingTest.cs | 303 +++++------ .../Upgrade/SchemaSharing/IgnoreRulesTest.cs | 252 ++++----- .../MetadataUpdate/SimpleTest.cs | 58 +- .../SchemaSharing/QueryBuilder/SimpleTest.cs | 75 ++- .../SchemaSharing/Requests/SimpleTest.cs | 94 ++-- .../SchemaSharing/SqlExecutor/SimpleTest.cs | 64 +-- .../SchemaSharing/StorageNodeBuildingTest.cs | 258 ++++----- 23 files changed, 1479 insertions(+), 1658 deletions(-) diff --git a/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs index 7597f63e70..aa9f61a0af 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs @@ -16,38 +16,42 @@ namespace Xtensive.Orm.Localization.Tests { public class MultipleNodesTest : CommonModelTest { + private const string Node1Id = "Node1"; + private const string Node2Id = "Node2"; + private const string Node3Id = "Node3"; + private const string Node4Id = "Node4"; + private const string DefaultNodeSchema = "dbo"; private const string FirstNodeSchema = "Model1"; private const string SecondNodeSchema = "Model2"; private const string ThridNodeSchema = "Model3"; private const string ForthNodeSchema = "Model4"; - private static CultureInfo EnglishCulture = new CultureInfo("en-US"); - private static string EnglishTitle = "Welcome!"; - private static string EnglishContent = "My dear guests, welcome to my birthday party!"; + private static readonly CultureInfo EnglishCulture = new CultureInfo("en-US"); + private static readonly string EnglishTitle = "Welcome!"; + private static readonly string EnglishContent = "My dear guests, welcome to my birthday party!"; - private static CultureInfo SpanishCulture = new CultureInfo("es-ES"); - private static string SpanishTitle = "Bienvenido!"; - private static string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; + private static readonly CultureInfo SpanishCulture = new CultureInfo("es-ES"); + private static readonly string SpanishTitle = "Bienvenido!"; + private static readonly string SpanishContent = "Mis amigos mejores! Bienvenido a mi cumpleanos!"; - protected override void CheckRequirements() - { + protected override void CheckRequirements() => Require.AllFeaturesSupported(Providers.ProviderFeatures.Multischema); - } protected override Domain BuildDomain(DomainConfiguration configuration) { var domain = base.BuildDomain(configuration); - foreach (var nodeConfiguration in BuildNodeConfigurations()) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in BuildNodeConfigurations()) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } return domain; } protected override DomainConfiguration BuildConfiguration() { var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (ILocalizable<>).Assembly); - configuration.Types.Register(typeof (AutoBuildTest).Assembly, typeof (AutoBuildTest).Namespace); + configuration.Types.Register(typeof(ILocalizable<>).Assembly); + configuration.Types.Register(typeof(AutoBuildTest).Assembly, typeof(AutoBuildTest).Namespace); configuration.DefaultSchema = DefaultNodeSchema; configuration.UpgradeMode = DomainUpgradeMode.Recreate; return configuration; @@ -56,213 +60,193 @@ protected override DomainConfiguration BuildConfiguration() [Test] public void Node1Test01() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node1Test02() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - var localization = welcomePage.Localizations[EnglishCulture]; - localization.Title = EnglishTitle; - localization.Content = EnglishContent; - - localization = welcomePage.Localizations[SpanishCulture]; - localization.Title = SpanishTitle; - localization.Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + var localization = welcomePage.Localizations[EnglishCulture]; + localization.Title = EnglishTitle; + localization.Content = EnglishContent; + + localization = welcomePage.Localizations[SpanishCulture]; + localization.Title = SpanishTitle; + localization.Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node2Test01() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node1"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node1Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node2Test02() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node1"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - var localization = welcomePage.Localizations[EnglishCulture]; - localization.Title = EnglishTitle; - localization.Content = EnglishContent; - - localization = welcomePage.Localizations[SpanishCulture]; - localization.Title = SpanishTitle; - localization.Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node1Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + var localization = welcomePage.Localizations[EnglishCulture]; + localization.Title = EnglishTitle; + localization.Content = EnglishContent; + + localization = welcomePage.Localizations[SpanishCulture]; + localization.Title = SpanishTitle; + localization.Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node3Test01() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node2"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node2Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node3Test02() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node2"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - var localization = welcomePage.Localizations[EnglishCulture]; - localization.Title = EnglishTitle; - localization.Content = EnglishContent; - - localization = welcomePage.Localizations[SpanishCulture]; - localization.Title = SpanishTitle; - localization.Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node2Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + var localization = welcomePage.Localizations[EnglishCulture]; + localization.Title = EnglishTitle; + localization.Content = EnglishContent; + + localization = welcomePage.Localizations[SpanishCulture]; + localization.Title = SpanishTitle; + localization.Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node4Test01() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node3"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node3Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node4Test02() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node3"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - var localization = welcomePage.Localizations[EnglishCulture]; - localization.Title = EnglishTitle; - localization.Content = EnglishContent; - - localization = welcomePage.Localizations[SpanishCulture]; - localization.Title = SpanishTitle; - localization.Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node3Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + var localization = welcomePage.Localizations[EnglishCulture]; + localization.Title = EnglishTitle; + localization.Content = EnglishContent; + + localization = welcomePage.Localizations[SpanishCulture]; + localization.Title = SpanishTitle; + localization.Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node5Test01() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node4"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; - welcomePage.Localizations[EnglishCulture].Content = EnglishContent; - welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; - welcomePage.Localizations[SpanishCulture].Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node4Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + welcomePage.Localizations[EnglishCulture].Title = EnglishTitle; + welcomePage.Localizations[EnglishCulture].Content = EnglishContent; + welcomePage.Localizations[SpanishCulture].Title = SpanishTitle; + welcomePage.Localizations[SpanishCulture].Content = SpanishContent; + + session.SaveChanges(); } } [Test] public void Node5Test02() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode("Node4"); - using (var transaction = session.OpenTransaction()) { - var welcomePage = new Page(session); - var localization = welcomePage.Localizations[EnglishCulture]; - localization.Title = EnglishTitle; - localization.Content = EnglishContent; - - localization = welcomePage.Localizations[SpanishCulture]; - localization.Title = SpanishTitle; - localization.Content = SpanishContent; - - session.SaveChanges(); - transaction.Complete(); - } + var selectedNode = Domain.SelectStorageNode(Node4Id); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var welcomePage = new Page(session); + var localization = welcomePage.Localizations[EnglishCulture]; + localization.Title = EnglishTitle; + localization.Content = EnglishContent; + + localization = welcomePage.Localizations[SpanishCulture]; + localization.Title = SpanishTitle; + localization.Content = SpanishContent; + + session.SaveChanges(); } } private IEnumerable BuildNodeConfigurations() { - var first = new NodeConfiguration("Node1"); + var first = new NodeConfiguration(Node1Id); first.SchemaMapping.Add(DefaultNodeSchema, FirstNodeSchema); first.UpgradeMode = DomainUpgradeMode.Recreate; - var second = new NodeConfiguration("Node2"); + var second = new NodeConfiguration(Node2Id); second.SchemaMapping.Add(DefaultNodeSchema, SecondNodeSchema); second.UpgradeMode = DomainUpgradeMode.Recreate; - var third = new NodeConfiguration("Node3"); + var third = new NodeConfiguration(Node3Id); third.SchemaMapping.Add(DefaultNodeSchema, ThridNodeSchema); third.UpgradeMode = DomainUpgradeMode.Recreate; - var fourth = new NodeConfiguration("Node4"); + var fourth = new NodeConfiguration(Node4Id); fourth.SchemaMapping.Add(DefaultNodeSchema, ForthNodeSchema); fourth.UpgradeMode = DomainUpgradeMode.Recreate; diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs index 9153670f65..31790caf47 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs @@ -1,4 +1,8 @@ -using System; +// Copyright (C) 2015-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System; using System.Diagnostics; using System.Collections.Generic; using System.Linq; @@ -189,20 +193,22 @@ public class IssueJira0614_MaterializationContextModel { private const string Node2Name = "Node2"; private const string Node1Name = "Node1"; - private const string ErrorInTestFixtureSetup = "Error in Text fixture setup {0}"; + + [OneTimeSetUp] + public void TestFixtureSetUp() => Require.ProviderIs(StorageProvider.SqlServer); [Test] public void Test01() { - var configuration1 = CreateConfiguration(typeof (Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); - var configuration2 = CreateConfiguration(typeof (Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); + var configuration1 = CreateConfiguration(typeof(Node1.TimesheetCode), DomainUpgradeMode.Recreate, "Model1"); + var configuration2 = CreateConfiguration(typeof(Node2.TimesheetCode), DomainUpgradeMode.Recreate, "Model2"); using (var domain = BuildDomain(configuration1)) { - Assert.That(domain.Model.Types[typeof (Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); + Assert.That(domain.Model.Types[typeof(Node1.TimesheetCode)].TypeId, Is.EqualTo(288)); using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { for (var i = 0; i < 10; i++) { - new Node1.TimesheetCode(session) { + _ = new Node1.TimesheetCode(session) { Active = i % 2==0, Code = "jdfgdj" + i, Description = "dfjghjdhfgjhsjkhgjdfg", @@ -232,7 +238,7 @@ public void Test01() using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { for (var i = 0; i < 10; i++) { - new Node2.TimesheetCode(session) { + _ = new Node2.TimesheetCode(session) { Active = i % 2 == 0, Code = "jdfgdj" + i, Description = "dfjghjdhfgjhsjkhgjdfg", @@ -257,12 +263,13 @@ public void Test01() } } - var multinodeDomainConfiguration = CreateConfiguration(typeof (Target.TimesheetCode), DomainUpgradeMode.Skip, "Model1"); + var multinodeDomainConfiguration = CreateConfiguration(typeof(Target.TimesheetCode), DomainUpgradeMode.Skip, "Model1"); var nodeConfiguration = CreateNodeConfiguration(Node2Name, "Model1", "Model2", DomainUpgradeMode.Skip); + using (var domain = BuildDomain(multinodeDomainConfiguration)) { - domain.StorageNodeManager.AddNode(nodeConfiguration); - using (var session = domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var list = session.Query.All() .Where(c => c.Active) @@ -288,19 +295,17 @@ public void Test01() } } - using (var session = domain.OpenSession()) { - session.SelectStorageNode(Node2Name); - using (var transaction = session.OpenTransaction()) { - - var list = session.Query.All() - .Where(c => c.Active) - .OrderBy(c => c.Code) - .AsEnumerable() - .Select(c => new { - Value = c.Code, - Name = c.Code - }).ToList(); - } + selectedNode = domain.SelectStorageNode(Node2Name); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var list = session.Query.All() + .Where(c => c.Active) + .OrderBy(c => c.Code) + .AsEnumerable() + .Select(c => new { + Value = c.Code, + Name = c.Code + }).ToList(); } } } @@ -316,7 +321,7 @@ public void Test02() using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { for (var i = 0; i < 10; i++) { - new Node1.TimesheetCode(session) { + _ = new Node1.TimesheetCode(session) { Active = i % 2 == 0, Code = "jdfgdj" + i, Description = "dfjghjdhfgjhsjkhgjdfg", @@ -347,7 +352,7 @@ public void Test02() using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { for (var i = 0; i < 10; i++) { - new Node2.TimesheetCode(session) { + _ = new Node2.TimesheetCode(session) { Active = i % 2 == 0, Code = "jdfgdj" + i, Description = "dfjghjdhfgjhsjkhgjdfg", @@ -364,8 +369,7 @@ public void Test02() .Where(c => c.Active) .OrderBy(c => c.Code) .AsEnumerable() - .Select(c => new - { + .Select(c => new { Value = c.Code, Name = c.Code }).ToList(); @@ -375,28 +379,28 @@ public void Test02() var multinodeDomainConfiguration = CreateConfiguration(typeof(Target.TimesheetCode), DomainUpgradeMode.PerformSafely, "Model2"); var nodeConfiguration = CreateNodeConfiguration(Node1Name, "Model2", "Model1", DomainUpgradeMode.PerformSafely); + using (var domain = BuildDomain(multinodeDomainConfiguration, nodeConfiguration)) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var list = session.Query.All() .Where(c => c.Active) .OrderBy(c => c.Code) .AsEnumerable() - .Select(c => new - { + .Select(c => new { Value = c.Code, Name = c.Code }).ToList(); Assert.That(list.Count, Is.EqualTo(5)); } + using (var transaction = session.OpenTransaction()) { var list = session.Query.All() .Where(c => c.Active) .OrderBy(c => c.Code) .AsEnumerable() - .Select(c => new - { + .Select(c => new { Value = c.Code, Name = c.Code }).ToList(); @@ -404,16 +408,14 @@ public void Test02() } } - using (var session = domain.OpenSession()) { - session.SelectStorageNode(Node1Name); + selectedNode = domain.SelectStorageNode(Node1Name); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { - var list = session.Query.All() .Where(c => c.Active) .OrderBy(c => c.Code) .AsEnumerable() - .Select(c => new - { + .Select(c => new { Value = c.Code, Name = c.Code }).ToList(); @@ -434,7 +436,6 @@ public void Test02() private void CheckRequirements() { - Require.AllFeaturesSupported(ProviderFeatures.Multischema); Require.ProviderIs(StorageProvider.SqlServer); } @@ -469,25 +470,5 @@ private NodeConfiguration CreateNodeConfiguration(string nodeId, string oldSchem configuration.UpgradeMode = upgradeMode; return configuration; } - - [OneTimeSetUp] - public void TestFixtureSetUp() - { - try { - CheckRequirements(); - } - catch (IgnoreException) { - throw; - } - catch (Exception e) { - Debug.WriteLine(ErrorInTestFixtureSetup, e); - throw; - } - } - - [OneTimeTearDown] - public void TestFixtureTearDown() - { - } } } diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs index 222f0c1549..e39331183b 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2016-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2016.04.16 @@ -400,8 +400,8 @@ public void MainTest() using (var domain = Domain.Build(configuration)) { Assert.That(domain.Configuration.IsMultischema, Is.EqualTo(true)); Assert.That(domain.Configuration.IsMultidatabase, Is.EqualTo(false)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); CheckNode(domain, alpha.Name, false); CheckNode(domain, beta.Name, true); @@ -461,18 +461,17 @@ private void BuildBaseVersion() { var configuration = BuildConfiguration(main, DomainUpgradeMode.Recreate, typeof (ModelNamespace.HintTest.BaseVersion.Customer)); using (var domain = Domain.Build(configuration)) { - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); - - using (var session = domain.OpenSession()) { - session.SelectStorageNode(alpha.Name); - using (var tx = session.OpenTransaction()) { - new ModelNamespace.HintTest.BaseVersion.Customer { Name = "CustomerName" }; - new ModelNamespace.HintTest.BaseVersion.Customer { Name = "Groznov" }; - new ModelNamespace.HintTest.BaseVersion.Order { Number = 99, Text = "Test order number 99" }; - new ModelNamespace.HintTest.BaseVersion.Order { Number = 1, Text = "Test order number 1" }; - tx.Complete(); - } + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); + + var selectedNode = domain.SelectStorageNode(alpha.Name); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + _ = new ModelNamespace.HintTest.BaseVersion.Customer { Name = "CustomerName" }; + _ = new ModelNamespace.HintTest.BaseVersion.Customer { Name = "Groznov" }; + _ = new ModelNamespace.HintTest.BaseVersion.Order { Number = 99, Text = "Test order number 99" }; + _ = new ModelNamespace.HintTest.BaseVersion.Order { Number = 1, Text = "Test order number 1" }; + tx.Complete(); } } } @@ -481,8 +480,8 @@ private void BuildUpgradedVersion(Type type) { var configuration = BuildConfiguration(main, DomainUpgradeMode.PerformSafely, type); using (var domain = Domain.Build(configuration)) { - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.PerformSafely)); - domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.PerformSafely)); + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.PerformSafely)); + _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.PerformSafely)); } } @@ -500,12 +499,17 @@ private void CheckNode(Domain domain, string nodeName, bool spoiledExpected) currentModel.UpdateReferences(); currentModel.UpdateMappings(node.Configuration); //this operation suppose to be performed by DataObjects internally - foreach (var typeInfo in currentModel.Types.Where(t => !t.IsSystem)) + foreach (var typeInfo in currentModel.Types.Where(t => !t.IsSystem)) { Assert.AreEqual(typeInfo.MappingSchema, expectedSchema); + } + + var func = spoiledExpected + ? new Action(Assert.AreNotEqual) + : new Action(Assert.AreEqual); - var func = spoiledExpected ? new Action(Assert.AreNotEqual) : new Action(Assert.AreEqual); - foreach (var typeInfo in spoiledModel.Types.Where(t => !t.IsSystem)) + foreach (var typeInfo in spoiledModel.Types.Where(t => !t.IsSystem)) { func(typeInfo.MappingSchema, expectedSchema); + } } private NodeConfiguration BuildNodeConfiguration(DomainConfiguration domainConfiguration, ClientNodeConfiguration nodeConfiguration, DomainUpgradeMode upgradeMode) @@ -514,8 +518,10 @@ private NodeConfiguration BuildNodeConfiguration(DomainConfiguration domainConfi node.ConnectionInfo = nodeConfiguration.ConnectionInfo; node.ConnectionInitializationSql = nodeConfiguration.InitializationSql; node.UpgradeMode = upgradeMode; - if (!domainConfiguration.DefaultSchema.IsNullOrEmpty() && !nodeConfiguration.DefaultSchema.IsNullOrEmpty()) + if (!domainConfiguration.DefaultSchema.IsNullOrEmpty() && !nodeConfiguration.DefaultSchema.IsNullOrEmpty()) { node.SchemaMapping.Add(domainConfiguration.DefaultSchema, nodeConfiguration.DefaultSchema); + } + return node; } @@ -556,8 +562,9 @@ private void BuildNodeConfigurationsMetadata() private ConnectionInfo ComposeConnectionToMasterDatabase(ConnectionInfo baseConnectionInfo) { - if (baseConnectionInfo.ConnectionUrl==null) + if (baseConnectionInfo.ConnectionUrl==null) { throw new InvalidOperationException("Can't convert connection string based ConnectionInfo"); + } var provider = baseConnectionInfo.ConnectionUrl.Protocol; var user = baseConnectionInfo.ConnectionUrl.User; @@ -567,21 +574,21 @@ private ConnectionInfo ComposeConnectionToMasterDatabase(ConnectionInfo baseConn var database = "master"; var parameters = baseConnectionInfo.ConnectionUrl.Params; - string urlTemplate = "{0}://{1}{2}{3}/{4}{5}"; + var urlTemplate = "{0}://{1}{2}{3}/{4}{5}"; var authenticationPartTemplate = "{0}:{1}@"; var authentication = user.IsNullOrEmpty() ? string.Empty : string.Format(authenticationPartTemplate, user, password); - var portPart = port==0 + var portPart = port == 0 ? string.Empty : ":" + port; var parametersPart = string.Empty; if (parameters.Count > 0) { parametersPart += "?"; - parametersPart = parameters.Aggregate(parametersPart, (current, parameter) => current + (parameter.Key + "=" + parameter.Value + "&")); + parametersPart = parameters.Aggregate(parametersPart, (current, parameter) => current + parameter.Key + "=" + parameter.Value + "&"); parametersPart = parametersPart.TrimEnd('&'); } diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs index a67618555d..b00e2ce28c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2014-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Denis Krjuchkov // Created: 2014.03.26 @@ -116,16 +116,17 @@ public void MainTest() InitializeSchemas(); - BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof (Entity1)).Dispose(); - BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof (Entity1), typeof (Entity2)).Dispose(); - - BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity2)); - BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof (Entity2), typeof (Entity1)).Dispose(); + BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof(Entity1)).Dispose(); + BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof(Entity1), typeof(Entity2)).Dispose(); - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof (Entity1), typeof (Entity2))) { - var nodeConfiguration = new NodeConfiguration(AlternativeSchema) {UpgradeMode = DomainUpgradeMode.Validate}; + BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof(Entity2)).Dispose(); + BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof(Entity2), typeof(Entity1)).Dispose(); + + var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof(Entity1), typeof(Entity2)); + using (domain) { + var nodeConfiguration = new NodeConfiguration(AlternativeSchema) { UpgradeMode = DomainUpgradeMode.Validate }; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); RunTest(domain, WellKnown.DefaultNodeId, MainTestBody); RunTest(domain, AlternativeSchema, MainTestBody); @@ -140,15 +141,17 @@ public void SelectAbstractClassDescendantsTest() InitializeSchemas(); BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof (Entity3)).Dispose(); - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof (Entity3), typeof (Entity4))) + + var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof(Entity3), typeof(Entity4)); + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new Entity3 { + for (var i = 0; i < 10; i++) { + _ = new Entity3 { Name = "1 before test " + i, StringValue = "1 before test " + i }; - new Entity4 { + _ = new Entity4 { Name = "1 before test " + i, IntValue = i }; @@ -156,16 +159,18 @@ public void SelectAbstractClassDescendantsTest() transaction.Complete(); } - BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity4)); - using (var domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof (Entity4), typeof (Entity3))) + BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity4)).Dispose(); + + domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof(Entity4), typeof(Entity3)); + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new Entity3 { + for (var i = 0; i < 10; i++) { + _ = new Entity3 { Name = "2 before test " + i, StringValue = "1 before test " + i }; - new Entity4 { + _ = new Entity4 { Name = "2 before test " + i, IntValue = i }; @@ -173,10 +178,11 @@ public void SelectAbstractClassDescendantsTest() transaction.Complete(); } - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof (Entity3), typeof (Entity4))) { + domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof(Entity3), typeof(Entity4)); + using (domain) { var nodeConfiguration = new NodeConfiguration(AlternativeSchema) { UpgradeMode = DomainUpgradeMode.Validate }; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); RunTest(domain, WellKnown.DefaultNodeId, AbstractClassDescendantsTestBody); RunTest(domain, AlternativeSchema, AbstractClassDescendantsTestBody); @@ -191,16 +197,18 @@ public void SelectInterfaceImplementationsTest() InitializeSchemas(); BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof (SomeInterfaceImpl1)).Dispose(); - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof (SomeInterfaceImpl1), typeof (SomeInterfaceImpl2))) + var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof(SomeInterfaceImpl1), typeof(SomeInterfaceImpl2)); + + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new SomeInterfaceImpl1 { + for (var i = 0; i < 10; i++) { + _ = new SomeInterfaceImpl1 { Name = "1 before test " + i, StringValue = "1 before test " + i, GuidValue = Guid.NewGuid() }; - new SomeInterfaceImpl2 { + _ = new SomeInterfaceImpl2 { Name = "1 before test " + i, IntValue = i, GuidValue = Guid.NewGuid() @@ -209,17 +217,19 @@ public void SelectInterfaceImplementationsTest() transaction.Complete(); } - BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (SomeInterfaceImpl2)); - using (var domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof (SomeInterfaceImpl1), typeof (SomeInterfaceImpl2))) + BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (SomeInterfaceImpl2)).Dispose(); + domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof(SomeInterfaceImpl1), typeof(SomeInterfaceImpl2)); + + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new SomeInterfaceImpl1 { + for (var i = 0; i < 10; i++) { + _ = new SomeInterfaceImpl1 { Name = "2 before test " + i, StringValue = "1 before test " + i, GuidValue = Guid.NewGuid() }; - new SomeInterfaceImpl2 { + _ = new SomeInterfaceImpl2 { Name = "2 before test " + i, IntValue = i, GuidValue = Guid.NewGuid() @@ -228,10 +238,12 @@ public void SelectInterfaceImplementationsTest() transaction.Complete(); } - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof (SomeInterfaceImpl1), typeof (SomeInterfaceImpl2))) { + domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof(SomeInterfaceImpl1), typeof(SomeInterfaceImpl2)); + + using (domain) { var nodeConfiguration = new NodeConfiguration(AlternativeSchema) { UpgradeMode = DomainUpgradeMode.Validate }; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); RunTest(domain, WellKnown.DefaultNodeId, InterfaceTestBody); RunTest(domain, AlternativeSchema, InterfaceTestBody); @@ -246,15 +258,17 @@ public void SelectNonAbstractDescendant() InitializeSchemas(); BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof (Entity1)).Dispose(); - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof (Entity1), typeof (Entity2))) + var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof(Entity1), typeof(Entity2)); + + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new Entity1 { + for (var i = 0; i < 10; i++) { + _ = new Entity1 { Name = "1 before test " + i, StringValue = "1 before test " + i }; - new Entity2 { + _ = new Entity2 { Name = "1 before test " + i, IntValue = i }; @@ -262,16 +276,18 @@ public void SelectNonAbstractDescendant() transaction.Complete(); } - BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity2)); - using (var domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof (Entity2), typeof (Entity1))) + BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity2)).Dispose(); + domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof(Entity2), typeof(Entity1)); + + using (domain) using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { - for (int i = 0; i < 10; i++) { - new Entity1 { + for (var i = 0; i < 10; i++) { + _ = new Entity1 { Name = "2 before test " + i, StringValue = "1 before test " + i }; - new Entity2 { + _ = new Entity2 { Name = "2 before test " + i, IntValue = i }; @@ -279,10 +295,11 @@ public void SelectNonAbstractDescendant() transaction.Complete(); } - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof (Entity1), typeof (Entity2))) { + domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof(Entity1), typeof(Entity2)); + using (domain) { var nodeConfiguration = new NodeConfiguration(AlternativeSchema) { UpgradeMode = DomainUpgradeMode.Validate }; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); RunTest(domain, WellKnown.DefaultNodeId, NonAbstractTypesTestBody); RunTest(domain, AlternativeSchema, NonAbstractTypesTestBody); @@ -300,30 +317,40 @@ public void TypeIdExtractionTest() var alternativeSchemaMap = new Dictionary(); BuildDomain(DefaultSchema, DomainUpgradeMode.Recreate, typeof (Entity1)).Dispose(); - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof (Entity1), typeof (Entity2))) + var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.PerformSafely, typeof(Entity1), typeof(Entity2)); + + using (domain) { defaultSchemaMap = domain.Model.Types.ToDictionary(el => el.UnderlyingType, el => el.TypeId); + } + + BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity2)).Dispose(); + domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof(Entity2), typeof(Entity1)); - BuildDomain(AlternativeSchema, DomainUpgradeMode.Recreate, typeof (Entity2)); - using ( var domain = BuildDomain(AlternativeSchema, DomainUpgradeMode.PerformSafely, typeof (Entity2), typeof (Entity1))) + using (domain) { alternativeSchemaMap = domain.Model.Types.ToDictionary(el => el.UnderlyingType, el => el.TypeId); + } - using (var domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof (Entity1), typeof (Entity2))) { + domain = BuildDomain(DefaultSchema, DomainUpgradeMode.Validate, typeof(Entity1), typeof(Entity2)); + + using (domain) { var nodeConfiguration = new NodeConfiguration(AlternativeSchema) {UpgradeMode = DomainUpgradeMode.Validate}; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); - using (var session = domain.OpenSession()) { - session.SelectStorageNode(WellKnown.DefaultNodeId); - var types = new[] {typeof (BaseEntity), typeof (Entity1), typeof (Entity2)}; - foreach (var type in types) + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) { + var types = new[] { typeof(BaseEntity), typeof(Entity1), typeof(Entity2) }; + foreach (var type in types) { Assert.That(session.StorageNode.TypeIdRegistry[domain.Model.Types[type]], Is.EqualTo(defaultSchemaMap[type])); + } } - using (var session = domain.OpenSession()) { - session.SelectStorageNode(AlternativeSchema); - var types = new[] {typeof (BaseEntity), typeof (Entity1), typeof (Entity2)}; - foreach (var type in types) + selectedNode = domain.SelectStorageNode(AlternativeSchema); + using (var session = selectedNode.OpenSession()) { + var types = new[] { typeof(BaseEntity), typeof(Entity1), typeof(Entity2) }; + foreach (var type in types) { Assert.That(session.StorageNode.TypeIdRegistry[domain.Model.Types[type]], Is.EqualTo(alternativeSchemaMap[type])); + } } } } @@ -336,32 +363,32 @@ private void MainTestBody(Domain domain, string nodeId) var stringValue = "entity1 " + nodeId; var intValue = stringValue.Length; - using (var session = domain.OpenSession()) + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(nodeId); var baseEntity = new BaseEntity {Name = baseName}; var entity1 = new Entity1 {Name = entity1Name, StringValue = stringValue}; var entity2 = new Entity2 {Name = entity2Name, IntValue = intValue}; tx.Complete(); } - using (var session = domain.OpenSession()) + selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(nodeId); - var baseTypeId = GetTypeId(session, typeof (BaseEntity)); - var baseEntity = session.Query.All().Single(e => e.TypeId==baseTypeId); + var baseTypeId = GetTypeId(session, typeof(BaseEntity)); + var baseEntity = session.Query.All().Single(e => e.TypeId == baseTypeId); Assert.That(baseEntity.Name, Is.EqualTo(baseName)); Assert.That(baseEntity.TypeId, Is.EqualTo(baseTypeId)); var entity1 = session.Query.All().Single(); Assert.That(entity1.Name, Is.EqualTo(entity1Name)); Assert.That(entity1.StringValue, Is.EqualTo(stringValue)); - Assert.That(entity1.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity1)))); + Assert.That(entity1.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity1)))); var entity2 = session.Query.All().Single(); Assert.That(entity2.Name, Is.EqualTo(entity2Name)); Assert.That(entity2.IntValue, Is.EqualTo(intValue)); - Assert.That(entity2.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity2)))); + Assert.That(entity2.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity2)))); baseEntity.Remove(); entity1.Remove(); @@ -373,9 +400,9 @@ private void MainTestBody(Domain domain, string nodeId) private void NonAbstractTypesTestBody(Domain domain, string nodeId) { - using (var session = domain.OpenSession()) + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { - session.SelectStorageNode(nodeId); var query1 = session.Query.All(); Assert.That(query1.Count(), Is.EqualTo(10)); foreach (var entity in query1) { @@ -398,16 +425,14 @@ private void NonAbstractTypesTestBody(Domain domain, string nodeId) var all = session.Query.All(); Assert.That(all.Count(), Is.EqualTo(20)); foreach (var baseAbstractEntity in all) { - var firstImplementation = baseAbstractEntity as Entity1; - if (firstImplementation!=null) { + if (baseAbstractEntity is Entity1 firstImplementation) { firstCounter++; - Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity1)))); + Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity1)))); continue; } - var secondImplementation = baseAbstractEntity as Entity2; - if (secondImplementation!=null) { + if (baseAbstractEntity is Entity2 secondImplementation) { secondCounter++; - Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity2)))); + Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity2)))); } } Assert.That(firstCounter + secondCounter, Is.EqualTo(20)); @@ -416,16 +441,16 @@ private void NonAbstractTypesTestBody(Domain domain, string nodeId) private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) { - using (var session = domain.OpenSession()) + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { - session.SelectStorageNode(nodeId); var query1 = session.Query.All(); Assert.That(query1.Count(), Is.EqualTo(10)); foreach (var entity in query1) { var id = entity.Id; var name = entity.Name; var stringValue = entity.StringValue; - Assert.That(entity.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity3)))); + Assert.That(entity.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity3)))); } var query2 = session.Query.All(); @@ -434,7 +459,7 @@ private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) var id = entity.Id; var name = entity.Name; var intValue = entity.IntValue; - Assert.That(entity.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity4)))); + Assert.That(entity.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity4)))); } var firstCounter = 0; @@ -442,16 +467,14 @@ private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) var all = session.Query.All(); Assert.That(all.Count(), Is.EqualTo(20)); foreach (var baseAbstractEntity in all) { - var firstImplementation = baseAbstractEntity as Entity3; - if (firstImplementation!=null) { + if (baseAbstractEntity is Entity3 firstImplementation) { firstCounter++; - Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity3)))); + Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity3)))); continue; } - var secondImplementation = baseAbstractEntity as Entity4; - if (secondImplementation!=null) { + if (baseAbstractEntity is Entity4 secondImplementation) { secondCounter++; - Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (Entity4)))); + Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(Entity4)))); } } Assert.That(firstCounter + secondCounter, Is.EqualTo(20)); @@ -460,9 +483,9 @@ private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) private void InterfaceTestBody(Domain domain, string nodeId) { - using (var session = domain.OpenSession()) + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { - session.SelectStorageNode(nodeId); var firstImplementationsBaseQuery = session.Query.All(); Assert.That(firstImplementationsBaseQuery.Count(), Is.EqualTo(10)); foreach (var someInterfaceImpl1 in firstImplementationsBaseQuery) { @@ -470,7 +493,7 @@ private void InterfaceTestBody(Domain domain, string nodeId) var name = someInterfaceImpl1.Name; var stringValue = someInterfaceImpl1.StringValue; var guidValue = someInterfaceImpl1.GuidValue; - Assert.That(someInterfaceImpl1.TypeId, Is.EqualTo(GetTypeId(session, typeof (SomeInterfaceImpl1)))); + Assert.That(someInterfaceImpl1.TypeId, Is.EqualTo(GetTypeId(session, typeof(SomeInterfaceImpl1)))); } var secondImplementationsBaseQuery = session.Query.All(); @@ -480,7 +503,7 @@ private void InterfaceTestBody(Domain domain, string nodeId) var name = someInterfaceImpl2.Name; var intValue = someInterfaceImpl2.IntValue; var guidValue = someInterfaceImpl2.GuidValue; - Assert.That(someInterfaceImpl2.TypeId, Is.EqualTo(GetTypeId(session, typeof (SomeInterfaceImpl2)))); + Assert.That(someInterfaceImpl2.TypeId, Is.EqualTo(GetTypeId(session, typeof(SomeInterfaceImpl2)))); } var allImplementationsBaseQuery = session.Query.All(); @@ -488,39 +511,35 @@ private void InterfaceTestBody(Domain domain, string nodeId) var firstImplementationsCount = 0; var secondImplementationsCount = 0; foreach (var containsGuidField in allImplementationsBaseQuery) { - var firstImplementation = containsGuidField as SomeInterfaceImpl1; - if (firstImplementation!=null) { + if (containsGuidField is SomeInterfaceImpl1 firstImplementation) { firstImplementationsCount++; - Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (SomeInterfaceImpl1)))); - continue; + Assert.That(firstImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(SomeInterfaceImpl1)))); + continue; } - var secondImplementation = containsGuidField as SomeInterfaceImpl2; - if (secondImplementation!=null) { + if (containsGuidField is SomeInterfaceImpl2 secondImplementation) { secondImplementationsCount++; - Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof (SomeInterfaceImpl2)))); + Assert.That(secondImplementation.TypeId, Is.EqualTo(GetTypeId(session, typeof(SomeInterfaceImpl2)))); } } Assert.That(firstImplementationsCount + secondImplementationsCount, Is.EqualTo(20)); } } - private void RunTest(Domain domain, string nodeId, Action testBody) - { + private void RunTest(Domain domain, string nodeId, Action testBody) => testBody.Invoke(domain, nodeId); - } - private static int GetTypeId(Session session, Type type) - { - return session.StorageNode.TypeIdRegistry[session.Domain.Model.Types[type]]; - } + private static int GetTypeId(Session session, Type type) => + session.StorageNode.TypeIdRegistry[session.Domain.Model.Types[type]]; private Domain BuildDomain(string schema, DomainUpgradeMode mode, params Type[] types) { var configuration = DomainConfigurationFactory.Create(); configuration.DefaultSchema = schema; configuration.UpgradeMode = mode; - foreach (var type in types) + foreach (var type in types) { configuration.Types.Register(type); + } + return Domain.Build(configuration); } } diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs index 08ce51ce00..4e750f06b9 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2019 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2019-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2019.01.28 @@ -42,7 +42,7 @@ public class MiddleTestEntity : BaseTestEntity public string MiddleOwnerNodeId { get; set; } public MiddleTestEntity(Session session) - :base(session) + : base(session) { } } @@ -66,26 +66,24 @@ public class CustomUpgradeHandler : UpgradeHandler public static Dictionary TypeIdPerNode = new Dictionary(); public static string CurrentNodeId = WellKnown.DefaultNodeId; - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } + public override bool CanUpgradeFrom(string oldVersion) => true; public override void OnPrepare() { - UpgradeContext.UserDefinedTypeMap.Add(typeof (BaseTestEntity).FullName, GetTypeId()); - UpgradeContext.UserDefinedTypeMap.Add(typeof (MiddleTestEntity).FullName, GetTypeId() + 1); - UpgradeContext.UserDefinedTypeMap.Add(typeof (LeafTestEntity).FullName, GetTypeId() + 2); + UpgradeContext.UserDefinedTypeMap.Add(typeof(BaseTestEntity).FullName, GetTypeId()); + UpgradeContext.UserDefinedTypeMap.Add(typeof(MiddleTestEntity).FullName, GetTypeId() + 1); + UpgradeContext.UserDefinedTypeMap.Add(typeof(LeafTestEntity).FullName, GetTypeId() + 2); } private int GetTypeId() { - if (CurrentNodeId==WellKnown.DefaultNodeId) + if (CurrentNodeId == WellKnown.DefaultNodeId) { return 100; - int result; - if (!TypeIdPerNode.TryGetValue(CurrentNodeId, out result)) - throw new Exception(string.Format("No map for node {0}", CurrentNodeId)); - return result; + } + + return !TypeIdPerNode.TryGetValue(CurrentNodeId, out var result) + ? throw new Exception(string.Format("No map for node {0}", CurrentNodeId)) + : result; } } } @@ -100,10 +98,8 @@ public sealed class QueryCachingTest : MultinodeTest private int initialQueriesCached = 0; - protected override void CheckRequirements() - { + protected override void CheckRequirements() => Require.AllFeaturesSupported(Orm.Providers.ProviderFeatures.Multischema); - } protected override DomainConfiguration BuildConfiguration() { @@ -111,7 +107,7 @@ protected override DomainConfiguration BuildConfiguration() CustomUpgradeHandler.TypeIdPerNode.Add(TestNodeId3, 300); var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (BaseTestEntity).Assembly, typeof (BaseTestEntity).Namespace); + configuration.Types.Register(typeof(BaseTestEntity).Assembly, typeof(BaseTestEntity).Namespace); configuration.UpgradeMode = DomainUpgradeMode.Recreate; configuration.DefaultSchema = "dbo"; return configuration; @@ -123,13 +119,13 @@ protected override void PopulateNodes() var nodeConfiguration = new NodeConfiguration(TestNodeId2); nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - Domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = Domain.StorageNodeManager.AddNode(nodeConfiguration); CustomUpgradeHandler.CurrentNodeId = TestNodeId3; nodeConfiguration = new NodeConfiguration(TestNodeId3); nodeConfiguration.SchemaMapping.Add("dbo", "Model2"); nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - Domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = Domain.StorageNodeManager.AddNode(nodeConfiguration); } protected override void PopulateData() @@ -137,83 +133,84 @@ protected override void PopulateData() var nodes = new[] { WellKnown.DefaultNodeId, TestNodeId2, TestNodeId3 }; foreach(var nodeId in nodes) { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var tx = session.OpenTransaction()) { - #region Entity creation - - new BaseTestEntity(session) { BaseName = "A", BaseOwnerNodeId = nodeId }; - new MiddleTestEntity(session) { - BaseName = "AA", - MiddleName = "AAM", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId }; - new LeafTestEntity(session) { - BaseName = "AAA", - MiddleName = "AAAM", - LeafName = "AAAL", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId, - LeafOwnerNodeId = nodeId }; - - new BaseTestEntity(session) { BaseName = "B", BaseOwnerNodeId = nodeId }; - new MiddleTestEntity(session) { - BaseName = "BB", - MiddleName = "BBM", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId - }; - new LeafTestEntity(session) { - BaseName = "BBB", - MiddleName = "BBBM", - LeafName = "BBBL", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId, - LeafOwnerNodeId = nodeId - }; - - new BaseTestEntity(session) { BaseName = "C", BaseOwnerNodeId = nodeId }; - new MiddleTestEntity(session) { - BaseName = "CC", - MiddleName = "CCM", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId - }; - new LeafTestEntity(session) { - BaseName = "CCC", - MiddleName = "CCCM", - LeafName = "CCCL", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId, - LeafOwnerNodeId = nodeId - }; - - new BaseTestEntity(session) { BaseName = "D", BaseOwnerNodeId = nodeId }; - new MiddleTestEntity(session) { - BaseName = "DD", - MiddleName = "DDM", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId - }; - new LeafTestEntity(session) { - BaseName = "DDD", - MiddleName = "DDDM", - LeafName = "DDDL", - BaseOwnerNodeId = nodeId, - MiddleOwnerNodeId = nodeId, - LeafOwnerNodeId = nodeId - }; - - #endregion - - //puts query to cache - ExecuteSimpleQueryCaching(session); - var expectedTypeId = GetExpectedTypeId(nodeId); - ExecuteFilterByTypeIdCaching(session, expectedTypeId); - ExecuteFilterBySeveralTypeIdsCaching(session, new[] { expectedTypeId, expectedTypeId }); - - tx.Complete(); - } + var selectedNode = Domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + #region Entity creation + + _ = new BaseTestEntity(session) { BaseName = "A", BaseOwnerNodeId = nodeId }; + _ = new MiddleTestEntity(session) { + BaseName = "AA", + MiddleName = "AAM", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId + }; + _ = new LeafTestEntity(session) { + BaseName = "AAA", + MiddleName = "AAAM", + LeafName = "AAAL", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId, + LeafOwnerNodeId = nodeId + }; + + _ = new BaseTestEntity(session) { BaseName = "B", BaseOwnerNodeId = nodeId }; + _ = new MiddleTestEntity(session) { + BaseName = "BB", + MiddleName = "BBM", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId + }; + _ = new LeafTestEntity(session) { + BaseName = "BBB", + MiddleName = "BBBM", + LeafName = "BBBL", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId, + LeafOwnerNodeId = nodeId + }; + + _ = new BaseTestEntity(session) { BaseName = "C", BaseOwnerNodeId = nodeId }; + _ = new MiddleTestEntity(session) { + BaseName = "CC", + MiddleName = "CCM", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId + }; + _ = new LeafTestEntity(session) { + BaseName = "CCC", + MiddleName = "CCCM", + LeafName = "CCCL", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId, + LeafOwnerNodeId = nodeId + }; + + _ = new BaseTestEntity(session) { BaseName = "D", BaseOwnerNodeId = nodeId }; + _ = new MiddleTestEntity(session) { + BaseName = "DD", + MiddleName = "DDM", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId + }; + _ = new LeafTestEntity(session) { + BaseName = "DDD", + MiddleName = "DDDM", + LeafName = "DDDL", + BaseOwnerNodeId = nodeId, + MiddleOwnerNodeId = nodeId, + LeafOwnerNodeId = nodeId + }; + + #endregion + + //puts query to cache + _ = ExecuteSimpleQueryCaching(session); + var expectedTypeId = GetExpectedTypeId(nodeId); + _ = ExecuteFilterByTypeIdCaching(session, expectedTypeId); + _ = ExecuteFilterBySeveralTypeIdsCaching(session, new[] { expectedTypeId, expectedTypeId }); + + tx.Complete(); } } @@ -249,191 +246,186 @@ public void TestNode3Test() private void RunTestSimpleQueryTest(string nodeId) { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var tx = session.OpenTransaction()) { - var expectedTypeId = GetExpectedTypeId(nodeId); - - var allResults = ExecuteSimpleQueryNoCache(session).OrderBy(e => e.TypeId).ToList(); - Assert.That(allResults.Count, Is.EqualTo(3)); - Assert.That(allResults.All(e => e.BaseOwnerNodeId==nodeId), Is.True); - Assert.That(allResults[0].BaseName, Is.EqualTo("C")); - Assert.That(allResults[0].TypeId, Is.EqualTo(expectedTypeId)); - Assert.That(allResults[1].BaseName, Is.EqualTo("CC")); - Assert.That(allResults[1].TypeId, Is.EqualTo(expectedTypeId + 1)); - Assert.That(allResults[2].BaseName, Is.EqualTo("CCC")); - Assert.That(allResults[2].TypeId, Is.EqualTo(expectedTypeId + 2)); - - var middles = allResults.OfType().ToList(); - Assert.That(middles.Count, Is.EqualTo(2)); - Assert.That(middles.All(e => e.MiddleOwnerNodeId==nodeId), Is.True); - Assert.That(middles[0].MiddleName, Is.EqualTo("CCM")); - Assert.That(middles[1].MiddleName, Is.EqualTo("CCCM")); - - var leafs = middles.OfType().ToList(); - Assert.That(leafs.Count, Is.EqualTo(1)); - Assert.That(leafs[0].LeafOwnerNodeId, Is.EqualTo(nodeId)); - Assert.That(leafs[0].LeafName, Is.EqualTo("CCCL")); - - allResults = ExecuteSimpleQueryCaching(session); - Assert.That(allResults.Count, Is.EqualTo(3)); - Assert.That(allResults.All(e => e.BaseOwnerNodeId==nodeId), Is.True); - Assert.That(allResults[0].BaseName, Is.EqualTo("B")); - Assert.That(allResults[0].TypeId, Is.EqualTo(expectedTypeId)); - Assert.That(allResults[1].BaseName, Is.EqualTo("BB")); - Assert.That(allResults[1].TypeId, Is.EqualTo(expectedTypeId + 1)); - Assert.That(allResults[2].BaseName, Is.EqualTo("BBB")); - Assert.That(allResults[2].TypeId, Is.EqualTo(expectedTypeId + 2)); - - middles = allResults.OfType().ToList(); - Assert.That(middles.Count, Is.EqualTo(2)); - Assert.That(middles.All(e => e.MiddleOwnerNodeId==nodeId), Is.True); - Assert.That(middles[0].MiddleName, Is.EqualTo("BBM")); - Assert.That(middles[1].MiddleName, Is.EqualTo("BBBM")); - - leafs = middles.OfType().ToList(); - Assert.That(leafs.Count, Is.EqualTo(1)); - Assert.That(leafs[0].LeafOwnerNodeId, Is.EqualTo(nodeId)); - Assert.That(leafs[0].LeafName, Is.EqualTo("BBBL")); - } + var selectedNode = Domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var expectedTypeId = GetExpectedTypeId(nodeId); + + var allResults = ExecuteSimpleQueryNoCache(session).OrderBy(e => e.TypeId).ToList(); + Assert.That(allResults.Count, Is.EqualTo(3)); + Assert.That(allResults.All(e => e.BaseOwnerNodeId == nodeId), Is.True); + Assert.That(allResults[0].BaseName, Is.EqualTo("C")); + Assert.That(allResults[0].TypeId, Is.EqualTo(expectedTypeId)); + Assert.That(allResults[1].BaseName, Is.EqualTo("CC")); + Assert.That(allResults[1].TypeId, Is.EqualTo(expectedTypeId + 1)); + Assert.That(allResults[2].BaseName, Is.EqualTo("CCC")); + Assert.That(allResults[2].TypeId, Is.EqualTo(expectedTypeId + 2)); + + var middles = allResults.OfType().ToList(); + Assert.That(middles.Count, Is.EqualTo(2)); + Assert.That(middles.All(e => e.MiddleOwnerNodeId == nodeId), Is.True); + Assert.That(middles[0].MiddleName, Is.EqualTo("CCM")); + Assert.That(middles[1].MiddleName, Is.EqualTo("CCCM")); + + var leafs = middles.OfType().ToList(); + Assert.That(leafs.Count, Is.EqualTo(1)); + Assert.That(leafs[0].LeafOwnerNodeId, Is.EqualTo(nodeId)); + Assert.That(leafs[0].LeafName, Is.EqualTo("CCCL")); + + allResults = ExecuteSimpleQueryCaching(session); + Assert.That(allResults.Count, Is.EqualTo(3)); + Assert.That(allResults.All(e => e.BaseOwnerNodeId == nodeId), Is.True); + Assert.That(allResults[0].BaseName, Is.EqualTo("B")); + Assert.That(allResults[0].TypeId, Is.EqualTo(expectedTypeId)); + Assert.That(allResults[1].BaseName, Is.EqualTo("BB")); + Assert.That(allResults[1].TypeId, Is.EqualTo(expectedTypeId + 1)); + Assert.That(allResults[2].BaseName, Is.EqualTo("BBB")); + Assert.That(allResults[2].TypeId, Is.EqualTo(expectedTypeId + 2)); + + middles = allResults.OfType().ToList(); + Assert.That(middles.Count, Is.EqualTo(2)); + Assert.That(middles.All(e => e.MiddleOwnerNodeId == nodeId), Is.True); + Assert.That(middles[0].MiddleName, Is.EqualTo("BBM")); + Assert.That(middles[1].MiddleName, Is.EqualTo("BBBM")); + + leafs = middles.OfType().ToList(); + Assert.That(leafs.Count, Is.EqualTo(1)); + Assert.That(leafs[0].LeafOwnerNodeId, Is.EqualTo(nodeId)); + Assert.That(leafs[0].LeafName, Is.EqualTo("BBBL")); } } private void RunFilterByTypeIdQueryTest(string nodeId) { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var tx = session.OpenTransaction()) { - var expectedTypeId = GetExpectedTypeId(nodeId); - - var resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId); - Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); - Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithoutCache.All(e => e.TypeId==expectedTypeId), Is.True); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithoutCache.OfType().Any(), Is.False); - Assert.That(resultWithoutCache.OfType().Any(), Is.False); - - resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId + 1); - Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); - Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithoutCache.All(e => e.TypeId==expectedTypeId + 1), Is.True); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithoutCache.OfType().Any(), Is.False); - - resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId + 2); - Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); - Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithoutCache.All(e => e.TypeId==expectedTypeId + 2), Is.True); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); - - var resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId); - Assert.That(resultWithCache.Count, Is.EqualTo(4)); - Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithCache.All(e => e.TypeId==expectedTypeId), Is.True); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithCache.OfType().Any(), Is.False); - Assert.That(resultWithCache.OfType().Any(), Is.False); - - resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId + 1); - Assert.That(resultWithCache.Count, Is.EqualTo(4)); - Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithCache.All(e => e.TypeId==expectedTypeId + 1), Is.True); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithCache.OfType().Any(), Is.False); - - resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId + 2); - Assert.That(resultWithCache.Count, Is.EqualTo(4)); - Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId==nodeId)); - Assert.That(resultWithCache.All(e => e.TypeId==expectedTypeId + 2), Is.True); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); - - var unexpectedTypeId = GetUnexpectedTypeId(nodeId); - resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, unexpectedTypeId); - Assert.That(resultWithoutCache.Count, Is.EqualTo(0)); - - resultWithCache = ExecuteFilterByTypeIdCaching(session, unexpectedTypeId); - Assert.That(resultWithCache.Count, Is.EqualTo(0)); - } + var selectedNode = Domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var expectedTypeId = GetExpectedTypeId(nodeId); + + var resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId); + Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); + Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithoutCache.All(e => e.TypeId == expectedTypeId), Is.True); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithoutCache.OfType().Any(), Is.False); + Assert.That(resultWithoutCache.OfType().Any(), Is.False); + + resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId + 1); + Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); + Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithoutCache.All(e => e.TypeId == expectedTypeId + 1), Is.True); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithoutCache.OfType().Any(), Is.False); + + resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, expectedTypeId + 2); + Assert.That(resultWithoutCache.Count, Is.EqualTo(4)); + Assert.That(resultWithoutCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithoutCache.All(e => e.TypeId == expectedTypeId + 2), Is.True); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithoutCache.OfType().Count(), Is.EqualTo(4)); + + var resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId); + Assert.That(resultWithCache.Count, Is.EqualTo(4)); + Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithCache.All(e => e.TypeId == expectedTypeId), Is.True); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithCache.OfType().Any(), Is.False); + Assert.That(resultWithCache.OfType().Any(), Is.False); + + resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId + 1); + Assert.That(resultWithCache.Count, Is.EqualTo(4)); + Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithCache.All(e => e.TypeId == expectedTypeId + 1), Is.True); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithCache.OfType().Any(), Is.False); + + resultWithCache = ExecuteFilterByTypeIdCaching(session, expectedTypeId + 2); + Assert.That(resultWithCache.Count, Is.EqualTo(4)); + Assert.That(resultWithCache.All(e => e.BaseOwnerNodeId == nodeId)); + Assert.That(resultWithCache.All(e => e.TypeId == expectedTypeId + 2), Is.True); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + Assert.That(resultWithCache.OfType().Count(), Is.EqualTo(4)); + + var unexpectedTypeId = GetUnexpectedTypeId(nodeId); + resultWithoutCache = ExecuteFilterByTypeIdNoCache(session, unexpectedTypeId); + Assert.That(resultWithoutCache.Count, Is.EqualTo(0)); + + resultWithCache = ExecuteFilterByTypeIdCaching(session, unexpectedTypeId); + Assert.That(resultWithCache.Count, Is.EqualTo(0)); } } private void RunFilterBySeveralTypeIdsTest(string nodeId) { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var tx = session.OpenTransaction()) { - var expectedTypeId = GetExpectedTypeId(nodeId); - - var allResults = ExecuteFilterBySeveralTypeIdsNoCache(session, new[] { expectedTypeId, expectedTypeId + 1 }) - .OrderBy(e => e.TypeId) - .ToList(); - Assert.That(allResults.Count, Is.EqualTo(8)); - Assert.That(allResults.All(e => e.BaseOwnerNodeId==nodeId), Is.True); - Assert.That(allResults.Count(e => e.TypeId==expectedTypeId), Is.EqualTo(4)); - Assert.That(allResults.Count(e => e.TypeId==expectedTypeId + 1), Is.EqualTo(4)); - - var middles = allResults.OfType().ToList(); - Assert.That(middles.Count, Is.EqualTo(4)); - Assert.That(middles.All(e => e.MiddleOwnerNodeId==nodeId), Is.True); - - allResults = ExecuteFilterBySeveralTypeIdsCaching(session, new[] { expectedTypeId, expectedTypeId + 1 }); - Assert.That(allResults.Count, Is.EqualTo(8)); - Assert.That(allResults.All(e => e.BaseOwnerNodeId == nodeId), Is.True); - Assert.That(allResults.Count(e => e.TypeId==expectedTypeId), Is.EqualTo(4)); - Assert.That(allResults.Count(e => e.TypeId==expectedTypeId + 1), Is.EqualTo(4)); - - middles = allResults.OfType().ToList(); - Assert.That(middles.Count, Is.EqualTo(4)); - Assert.That(middles.All(e => e.MiddleOwnerNodeId==nodeId), Is.True); - - var unexpectedTypeIds = GetUnexpectedTypeIds(nodeId); - allResults = ExecuteFilterBySeveralTypeIdsNoCache(session, unexpectedTypeIds); - Assert.That(allResults.Count, Is.EqualTo(0)); - - allResults = ExecuteFilterBySeveralTypeIdsCaching(session, unexpectedTypeIds); - Assert.That(allResults.Count, Is.EqualTo(0)); - } + var selectedNode = Domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var expectedTypeId = GetExpectedTypeId(nodeId); + + var allResults = ExecuteFilterBySeveralTypeIdsNoCache(session, new[] { expectedTypeId, expectedTypeId + 1 }) + .OrderBy(e => e.TypeId) + .ToList(); + Assert.That(allResults.Count, Is.EqualTo(8)); + Assert.That(allResults.All(e => e.BaseOwnerNodeId == nodeId), Is.True); + Assert.That(allResults.Count(e => e.TypeId == expectedTypeId), Is.EqualTo(4)); + Assert.That(allResults.Count(e => e.TypeId == expectedTypeId + 1), Is.EqualTo(4)); + + var middles = allResults.OfType().ToList(); + Assert.That(middles.Count, Is.EqualTo(4)); + Assert.That(middles.All(e => e.MiddleOwnerNodeId == nodeId), Is.True); + + allResults = ExecuteFilterBySeveralTypeIdsCaching(session, new[] { expectedTypeId, expectedTypeId + 1 }); + Assert.That(allResults.Count, Is.EqualTo(8)); + Assert.That(allResults.All(e => e.BaseOwnerNodeId == nodeId), Is.True); + Assert.That(allResults.Count(e => e.TypeId == expectedTypeId), Is.EqualTo(4)); + Assert.That(allResults.Count(e => e.TypeId == expectedTypeId + 1), Is.EqualTo(4)); + + middles = allResults.OfType().ToList(); + Assert.That(middles.Count, Is.EqualTo(4)); + Assert.That(middles.All(e => e.MiddleOwnerNodeId == nodeId), Is.True); + + var unexpectedTypeIds = GetUnexpectedTypeIds(nodeId); + allResults = ExecuteFilterBySeveralTypeIdsNoCache(session, unexpectedTypeIds); + Assert.That(allResults.Count, Is.EqualTo(0)); + + allResults = ExecuteFilterBySeveralTypeIdsCaching(session, unexpectedTypeIds); + Assert.That(allResults.Count, Is.EqualTo(0)); } } private int GetExpectedTypeId(string nodeId) { - return (nodeId==WellKnown.DefaultNodeId) + return (nodeId == WellKnown.DefaultNodeId) ? 100 : CustomUpgradeHandler.TypeIdPerNode[nodeId]; } private int GetUnexpectedTypeId(string nodeId) { - return (nodeId==WellKnown.DefaultNodeId) + return (nodeId == WellKnown.DefaultNodeId) ? CustomUpgradeHandler.TypeIdPerNode.First().Value : 100; } private int[] GetUnexpectedTypeIds(string nodeId) { - return (nodeId==WellKnown.DefaultNodeId) + return (nodeId == WellKnown.DefaultNodeId) ? CustomUpgradeHandler.TypeIdPerNode.Values.ToArray() - : CustomUpgradeHandler.TypeIdPerNode.Where(i => i.Key!=nodeId) + : CustomUpgradeHandler.TypeIdPerNode.Where(i => i.Key != nodeId) .Select(i => i.Value).Union(EnumerableUtils.One(100)).ToArray(); } - private List ExecuteSimpleQueryCaching(Session session) - { - return session.Query.Execute(SimpleQueryKey, q => q.All().Where(e => e.BaseName.Contains("B"))).ToList(); - } + private List ExecuteSimpleQueryCaching(Session session) => + session.Query.Execute(SimpleQueryKey, q => q.All().Where(e => e.BaseName.Contains("B"))).ToList(); - private List ExecuteFilterByTypeIdCaching(Session session, int typeId) - { - return session.Query.Execute(FilterByIdQueryKey, q => q.All().Where(e => e.TypeId==typeId)).ToList(); - } + private List ExecuteFilterByTypeIdCaching(Session session, int typeId) => + session.Query.Execute(FilterByIdQueryKey, q => q.All() + .Where(e => e.TypeId == typeId)) + .ToList(); private List ExecuteFilterBySeveralTypeIdsCaching(Session session, int[] typeIds) { @@ -443,19 +435,13 @@ private List ExecuteFilterBySeveralTypeIdsCaching(Session sessio .ToList(); } - private List ExecuteSimpleQueryNoCache(Session session) - { - return session.Query.All().Where(e => e.BaseName.Contains("C")).ToList(); - } + private List ExecuteSimpleQueryNoCache(Session session) => + session.Query.All().Where(e => e.BaseName.Contains("C")).ToList(); - private List ExecuteFilterByTypeIdNoCache(Session session, int typeId) - { - return session.Query.All().Where(e => e.TypeId==typeId).ToList(); - } + private List ExecuteFilterByTypeIdNoCache(Session session, int typeId) => + session.Query.All().Where(e => e.TypeId == typeId).ToList(); - private List ExecuteFilterBySeveralTypeIdsNoCache(Session session, int[] typeIds) - { - return session.Query.All().Where(e => e.TypeId.In(typeIds)).ToList(); - } + private List ExecuteFilterBySeveralTypeIdsNoCache(Session session, int[] typeIds) => + session.Query.All().Where(e => e.TypeId.In(typeIds)).ToList(); } } diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs index 859a1d9121..efe6441d8d 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2014-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Denis Krjuchkov // Created: 2014.03.26 @@ -28,9 +28,9 @@ protected override DomainConfiguration BuildConfiguration() protected override void PopulateData() { - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var apple = new Apple(TestAppleTag); var refObject = new FruitRef {Ref = apple}; testAppleKey = apple.Key; @@ -42,9 +42,12 @@ protected override void PopulateData() [Test] public void DoubleSelectNodeTest() { - using (var session = Domain.OpenSession()) { - session.SelectStorageNode(TestNodeId2); + //Delete this test when obolete method will be removed + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) { +#pragma warning disable CS0618 // Type or member is obsolete AssertEx.Throws(() => session.SelectStorageNode(TestNodeId3)); +#pragma warning restore CS0618 // Type or member is obsolete } } @@ -59,9 +62,9 @@ public void KeyNodeIdAssignTest() public void NodeIdLinq1Test() { // Entity fetched via LINQ - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.All().Single(a => a.Tag==TestAppleTag); Assert.That(result.Key.NodeId, Is.EqualTo(TestNodeId2)); } @@ -71,9 +74,9 @@ public void NodeIdLinq1Test() public void NodeIdLinq2Test() { // Key fetched via LINQ - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.All().GroupBy(a => a.Key).Select(a => a.Key).Single(); Assert.That(result.NodeId, Is.EqualTo(TestNodeId2)); } @@ -83,9 +86,9 @@ public void NodeIdLinq2Test() public void NodeIdLinq3Test() { // Key fetched via LINQ - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.All().Select(r => r.Ref.Key).Single(); Assert.That(result.NodeId, Is.EqualTo(TestNodeId2)); } @@ -95,9 +98,9 @@ public void NodeIdLinq3Test() public void NodeIdLinq4Test() { // Key fetched via LINQ - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.All().GroupBy(a => a.Ref.Key).Select(a => a.Key).Single(); Assert.That(result.NodeId, Is.EqualTo(TestNodeId2)); } @@ -107,9 +110,9 @@ public void NodeIdLinq4Test() public void NodeIdPrefetch1Test() { // Entity fetched via fetch API (key object) - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.Single(testAppleKey); Assert.That(result.Key.NodeId, Is.EqualTo(TestNodeId2)); } @@ -119,9 +122,9 @@ public void NodeIdPrefetch1Test() public void NodeIdPrefetch2Test() { // Entity fetched via fetch API (key values) - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.Single(TestAppleTag); Assert.That(result.Key.NodeId, Is.EqualTo(TestNodeId2)); } @@ -131,24 +134,23 @@ public void NodeIdPrefetch2Test() public void NodeIdPrefetch3Test() { // Entity fetched via fetch API (multiple key values) - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var result = session.Query.Many(new[] {TestAppleTag}).ToList(); Assert.That(result.Count, Is.EqualTo(1)); var item = result[0]; Assert.That(item.Key.NodeId, Is.EqualTo(TestNodeId2)); } - } [Test] public void NodeIdReferenceFetchTest() { // Entity fetched via reference traversal - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var refObject = session.Query.Single(testFruitRefKey); var result = refObject.Ref.Key; Assert.That(result.NodeId, Is.EqualTo(TestNodeId2)); @@ -159,9 +161,9 @@ public void NodeIdReferenceFetchTest() public void KeyNodeIdGenerateKeyTest() { // Custom generated key - using (var session = Domain.OpenSession()) + var selectedNode = Domain.SelectStorageNode(TestNodeId2); + using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { - session.SelectStorageNode(TestNodeId2); var generatedKey = Key.Generate(session); Assert.That(generatedKey.NodeId, Is.EqualTo(TestNodeId2)); } diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultidatabaseEntityManipulationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultidatabaseEntityManipulationTest.cs index d33ebf1af9..ced8f8f632 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultidatabaseEntityManipulationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultidatabaseEntityManipulationTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.04.05 @@ -13,25 +13,19 @@ namespace Xtensive.Orm.Tests.Storage.SchemaSharing.EntityManipulation { public class MultidatabaseEntityManipulationTest : SimpleEntityManipulationTest { - protected override NodeConfigurationType NodeConfiguration - { - get { return NodeConfigurationType.MultidatabaseNodes; } - } + protected override NodeConfigurationType NodeConfiguration => NodeConfigurationType.MultidatabaseNodes; - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); - } + protected override void CheckRequirements() => Require.AllFeaturesSupported(ProviderFeatures.Multidatabase); protected override void ApplyCustomSettingsToInitialConfiguration(DomainConfiguration configuration) { base.ApplyCustomSettingsToInitialConfiguration(configuration); configuration.DefaultSchema = "Model1"; configuration.DefaultDatabase = "DO-Tests-1"; - configuration.MappingRules.Map(typeof (model.Part1.TestEntity1).Assembly, typeof (model.Part1.TestEntity1).Namespace).To("DO-Tests-1", "Model1"); - configuration.MappingRules.Map(typeof (model.Part2.TestEntity2).Assembly, typeof (model.Part2.TestEntity2).Namespace).To("DO-Tests-1", "Model1"); - configuration.MappingRules.Map(typeof (model.Part3.TestEntity3).Assembly, typeof (model.Part3.TestEntity3).Namespace).To("DO-Tests-2", "Model3"); - configuration.MappingRules.Map(typeof (model.Part4.TestEntity4).Assembly, typeof (model.Part4.TestEntity4).Namespace).To("DO-Tests-2", "Model3"); + configuration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).To("DO-Tests-1", "Model1"); + configuration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).To("DO-Tests-1", "Model1"); + configuration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).To("DO-Tests-2", "Model3"); + configuration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).To("DO-Tests-2", "Model3"); } protected override void ApplyCustomSettingsToTestConfiguration(DomainConfiguration configuration) @@ -39,21 +33,21 @@ protected override void ApplyCustomSettingsToTestConfiguration(DomainConfigurati base.ApplyCustomSettingsToTestConfiguration(configuration); configuration.DefaultSchema = "Model1"; configuration.DefaultDatabase = "DO-Tests-1"; - configuration.MappingRules.Map(typeof (model.Part1.TestEntity1).Assembly, typeof (model.Part1.TestEntity1).Namespace).To("DO-Tests-1", "Model1"); - configuration.MappingRules.Map(typeof (model.Part2.TestEntity2).Assembly, typeof (model.Part2.TestEntity2).Namespace).To("DO-Tests-1", "Model1"); - configuration.MappingRules.Map(typeof (model.Part3.TestEntity3).Assembly, typeof (model.Part3.TestEntity3).Namespace).To("DO-Tests-2", "Model3"); - configuration.MappingRules.Map(typeof (model.Part4.TestEntity4).Assembly, typeof (model.Part4.TestEntity4).Namespace).To("DO-Tests-2", "Model3"); + configuration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).To("DO-Tests-1", "Model1"); + configuration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).To("DO-Tests-1", "Model1"); + configuration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).To("DO-Tests-2", "Model3"); + configuration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).To("DO-Tests-2", "Model3"); } protected override IEnumerable GetNodes(DomainUpgradeMode upgradeMode) { - var @default = new NodeConfiguration(WellKnown.DefaultNodeId) {UpgradeMode = upgradeMode}; - var additional = new NodeConfiguration("Additional") {UpgradeMode = upgradeMode}; + var @default = new NodeConfiguration(WellKnown.DefaultNodeId) { UpgradeMode = upgradeMode }; + var additional = new NodeConfiguration("Additional") { UpgradeMode = upgradeMode }; additional.DatabaseMapping.Add("DO-Tests-1", "DO-Tests-2"); additional.DatabaseMapping.Add("DO-Tests-2", "DO-Tests-4"); additional.SchemaMapping.Add("Model1", "Model2"); additional.SchemaMapping.Add("Model3", "Model4"); - return new[] {@default, additional}; + return new[] { @default, additional }; } } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultischemaEntityManipulationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultischemaEntityManipulationTest.cs index ccb18a4f84..d4c1a1bba6 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultischemaEntityManipulationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/MultischemaEntityManipulationTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.04.05 @@ -13,43 +13,37 @@ namespace Xtensive.Orm.Tests.Storage.SchemaSharing.EntityManipulation { public class MultischemaEntityManipulationTest : SimpleEntityManipulationTest { - protected override NodeConfigurationType NodeConfiguration - { - get { return NodeConfigurationType.MultischemaNodes; } - } + protected override NodeConfigurationType NodeConfiguration => NodeConfigurationType.MultischemaNodes; - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multischema); - } + protected override void CheckRequirements() => Require.AllFeaturesSupported(ProviderFeatures.Multischema); protected override void ApplyCustomSettingsToInitialConfiguration(DomainConfiguration configuration) { base.ApplyCustomSettingsToInitialConfiguration(configuration); configuration.DefaultSchema = "Model1"; - configuration.MappingRules.Map(typeof (model.Part1.TestEntity1).Assembly, typeof (model.Part1.TestEntity1).Namespace).ToSchema("Model1"); - configuration.MappingRules.Map(typeof (model.Part2.TestEntity2).Assembly, typeof (model.Part2.TestEntity2).Namespace).ToSchema("Model1"); - configuration.MappingRules.Map(typeof (model.Part3.TestEntity3).Assembly, typeof (model.Part3.TestEntity3).Namespace).ToSchema("Model3"); - configuration.MappingRules.Map(typeof (model.Part4.TestEntity4).Assembly, typeof (model.Part4.TestEntity4).Namespace).ToSchema("Model3"); + configuration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).ToSchema("Model1"); + configuration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).ToSchema("Model1"); + configuration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).ToSchema("Model3"); + configuration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).ToSchema("Model3"); } protected override void ApplyCustomSettingsToTestConfiguration(DomainConfiguration configuration) { base.ApplyCustomSettingsToTestConfiguration(configuration); configuration.DefaultSchema = "Model1"; - configuration.MappingRules.Map(typeof (model.Part1.TestEntity1).Assembly, typeof (model.Part1.TestEntity1).Namespace).ToSchema("Model1"); - configuration.MappingRules.Map(typeof (model.Part2.TestEntity2).Assembly, typeof (model.Part2.TestEntity2).Namespace).ToSchema("Model1"); - configuration.MappingRules.Map(typeof (model.Part3.TestEntity3).Assembly, typeof (model.Part3.TestEntity3).Namespace).ToSchema("Model3"); - configuration.MappingRules.Map(typeof (model.Part4.TestEntity4).Assembly, typeof (model.Part4.TestEntity4).Namespace).ToSchema("Model3"); + configuration.MappingRules.Map(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace).ToSchema("Model1"); + configuration.MappingRules.Map(typeof(model.Part2.TestEntity2).Assembly, typeof(model.Part2.TestEntity2).Namespace).ToSchema("Model1"); + configuration.MappingRules.Map(typeof(model.Part3.TestEntity3).Assembly, typeof(model.Part3.TestEntity3).Namespace).ToSchema("Model3"); + configuration.MappingRules.Map(typeof(model.Part4.TestEntity4).Assembly, typeof(model.Part4.TestEntity4).Namespace).ToSchema("Model3"); } protected override IEnumerable GetNodes(DomainUpgradeMode upgradeMode) { - var @default = new NodeConfiguration(WellKnown.DefaultNodeId) {UpgradeMode = upgradeMode}; - var additional = new NodeConfiguration("Additional") {UpgradeMode = upgradeMode}; + var @default = new NodeConfiguration(WellKnown.DefaultNodeId) { UpgradeMode = upgradeMode }; + var additional = new NodeConfiguration("Additional") { UpgradeMode = upgradeMode }; additional.SchemaMapping.Add("Model1", "Model2"); additional.SchemaMapping.Add("Model3", "Model4"); - return new[] {@default, additional}; + return new[] { @default, additional }; } } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs index 552ca3a103..6c7b1f8be5 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.04.05 @@ -25,24 +25,15 @@ protected enum NodeConfigurationType MultidatabaseNodes } - public Dictionary>> map = new Dictionary>>(); + private Dictionary>> map = new Dictionary>>(); - protected virtual NodeConfigurationType NodeConfiguration - { - get{return NodeConfigurationType.SingleSchemaNodes;} - } + protected virtual NodeConfigurationType NodeConfiguration => NodeConfigurationType.SingleSchemaNodes; [OneTimeSetUp] - public void TestFixtureSetup() - { - CheckRequirements(); - } + public void TestFixtureSetup() => CheckRequirements(); [SetUp] - public void SetUp() - { - PopulateInitialDataForNodes(); - } + public void SetUp() => PopulateInitialDataForNodes(); protected virtual void CheckRequirements() { @@ -50,46 +41,25 @@ protected virtual void CheckRequirements() [Test] - public void Recreate() - { - RunTest(DomainUpgradeMode.Recreate); - } + public void Recreate() => RunTest(DomainUpgradeMode.Recreate); [Test] - public void Skip() - { - RunTest(DomainUpgradeMode.Skip); - } + public void Skip() => RunTest(DomainUpgradeMode.Skip); [Test] - public void Validate() - { - RunTest(DomainUpgradeMode.Validate); - } + public void Validate() => RunTest(DomainUpgradeMode.Validate); [Test] - public void Perform() - { - RunTest(DomainUpgradeMode.Perform); - } + public void Perform() => RunTest(DomainUpgradeMode.Perform); [Test] - public void PerformSafely() - { - RunTest(DomainUpgradeMode.PerformSafely); - } + public void PerformSafely() => RunTest(DomainUpgradeMode.PerformSafely); [Test] - public void LegacySkip() - { - RunTest(DomainUpgradeMode.LegacySkip); - } + public void LegacySkip() => RunTest(DomainUpgradeMode.LegacySkip); [Test] - public void LegacyValidate() - { - RunTest(DomainUpgradeMode.LegacyValidate); - } + public void LegacyValidate() => RunTest(DomainUpgradeMode.LegacyValidate); protected void RunTest(DomainUpgradeMode upgradeMode) { @@ -102,19 +72,19 @@ protected void RunTest(DomainUpgradeMode upgradeMode) using (var domain = Domain.Build(configuration)) { var nodes = GetNodes(upgradeMode); - foreach (var storageNode in nodes.Where(n=>n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(storageNode); + foreach (var storageNode in nodes.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(storageNode); + } foreach (var storageNode in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(storageNode.NodeId); - using (var transaction = session.OpenTransaction()) { - Select(session, initialEntitiesCount); - var createdKeys = Insert(session, initialEntitiesCount); - Update(session, createdKeys, initialEntitiesCount); - Delete(session, createdKeys, initialEntitiesCount); - Select(session, initialEntitiesCount); - } + var selectedNode = domain.SelectStorageNode(storageNode.NodeId); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + Select(session, initialEntitiesCount); + var createdKeys = Insert(session, initialEntitiesCount); + Update(session, createdKeys, initialEntitiesCount); + Delete(session, createdKeys, initialEntitiesCount); + Select(session, initialEntitiesCount); } } } @@ -129,38 +99,37 @@ protected void PopulateInitialDataForNodes() using (var domain = Domain.Build(configuration)) { var nodes = GetNodes(DomainUpgradeMode.Recreate); - foreach (var storageNode in nodes.Where(n=>n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(storageNode); + foreach (var storageNode in nodes.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(storageNode); + } map = new Dictionary>>(); foreach (var storageNode in nodes) { var typesMap = new Dictionary>(); - using (var session = domain.OpenSession()) { - session.SelectStorageNode(storageNode.NodeId); - - using (var transaction = session.OpenTransaction()) { - var type = typeof(model.Part1.TestEntity1); - var pair = GetDatabaseAndSchemaForType(session, type); - new model.Part1.TestEntity1 {Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second}; - typesMap.Add(type, pair); - - type = typeof(model.Part2.TestEntity2); - pair = GetDatabaseAndSchemaForType(session, typeof(model.Part2.TestEntity2)); - new model.Part2.TestEntity2 {Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second}; - typesMap.Add(type, pair); - - type = typeof(model.Part3.TestEntity3); - pair = GetDatabaseAndSchemaForType(session, typeof(model.Part3.TestEntity3)); - new model.Part3.TestEntity3 {Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second}; - typesMap.Add(type, pair); - - type = typeof(model.Part4.TestEntity4); - pair = GetDatabaseAndSchemaForType(session, typeof(model.Part4.TestEntity4)); - new model.Part4.TestEntity4 {Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second}; - typesMap.Add(type, pair); - - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(storageNode.NodeId); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var type = typeof(model.Part1.TestEntity1); + var pair = GetDatabaseAndSchemaForType(session, type); + _ = new model.Part1.TestEntity1 { Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second }; + typesMap.Add(type, pair); + + type = typeof(model.Part2.TestEntity2); + pair = GetDatabaseAndSchemaForType(session, typeof(model.Part2.TestEntity2)); + _ = new model.Part2.TestEntity2 { Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second }; + typesMap.Add(type, pair); + + type = typeof(model.Part3.TestEntity3); + pair = GetDatabaseAndSchemaForType(session, typeof(model.Part3.TestEntity3)); + _ = new model.Part3.TestEntity3 { Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second }; + typesMap.Add(type, pair); + + type = typeof(model.Part4.TestEntity4); + pair = GetDatabaseAndSchemaForType(session, typeof(model.Part4.TestEntity4)); + _ = new model.Part4.TestEntity4 { Text = session.StorageNodeId, DatabaseName = pair.First, SchemaName = pair.Second }; + typesMap.Add(type, pair); + + transaction.Complete(); } map.Add(storageNode.NodeId, typesMap); } @@ -197,21 +166,24 @@ protected virtual void ApplyCustomSettingsToTestConfiguration(DomainConfiguratio protected virtual IEnumerable GetNodes(DomainUpgradeMode upgradeMode) { - return new[] {new NodeConfiguration(WellKnown.DefaultNodeId) {UpgradeMode = upgradeMode}}; + return new[] { new NodeConfiguration(WellKnown.DefaultNodeId) { UpgradeMode = upgradeMode } }; } private void Select(Session session, int initialCountOfEntities) { MainSelectTest(session, initialCountOfEntities); - if (NodeConfiguration==NodeConfigurationType.MultischemaNodes && - NodeConfiguration==NodeConfigurationType.MultidatabaseNodes) + if (NodeConfiguration == NodeConfigurationType.MultischemaNodes && + NodeConfiguration == NodeConfigurationType.MultidatabaseNodes) { AdditionalSelectTest(session, initialCountOfEntities); + } } private void MainSelectTest(Session session, int initialCountOfEntities) { - if (NodeConfiguration!=NodeConfigurationType.SingleSchemaNodes) + if (NodeConfiguration != NodeConfigurationType.SingleSchemaNodes) { return; + } + var storageNodeId = session.StorageNodeId; var a = session.Query.All().ToList(); var b = session.Query.All().ToList(); @@ -222,12 +194,13 @@ private void MainSelectTest(Session session, int initialCountOfEntities) Assert.That(c.Count, Is.EqualTo(initialCountOfEntities)); Assert.That(d.Count, Is.EqualTo(initialCountOfEntities)); - if (initialCountOfEntities==0) + if (initialCountOfEntities == 0) { return; + } - Dictionary> typesMap; - if (!map.TryGetValue(storageNodeId, out typesMap)) + if (!map.TryGetValue(storageNodeId, out var typesMap)) { throw new Exception(string.Format("Unknown node {0}. Probably you don't populate data", storageNodeId)); + } var entity1 = a[0]; Assert.That(entity1.Text, Is.EqualTo(storageNodeId)); @@ -236,7 +209,7 @@ private void MainSelectTest(Session session, int initialCountOfEntities) Assert.That(entity1.SchemaName, Is.EqualTo(databaseAndSchema.Second)); Entity entity = session.Query.All() - .FirstOrDefault(e => e.Text==storageNodeId && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Text == storageNodeId && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(entity, Is.Not.Null); var entity2 = b[0]; @@ -246,7 +219,7 @@ private void MainSelectTest(Session session, int initialCountOfEntities) Assert.That(entity2.SchemaName, Is.EqualTo(databaseAndSchema.Second)); entity = session.Query.All() - .FirstOrDefault(e => e.Text==storageNodeId && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Text == storageNodeId && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(entity, Is.Not.Null); var entity3 = c[0]; @@ -256,7 +229,7 @@ private void MainSelectTest(Session session, int initialCountOfEntities) Assert.That(entity3.SchemaName, Is.EqualTo(databaseAndSchema.Second)); entity = session.Query.All() - .FirstOrDefault(e => e.Text==storageNodeId && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Text == storageNodeId && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(entity, Is.Not.Null); var entity4 = d[0]; @@ -266,19 +239,20 @@ private void MainSelectTest(Session session, int initialCountOfEntities) Assert.That(entity4.SchemaName, Is.EqualTo(databaseAndSchema.Second)); entity = session.Query.All() - .FirstOrDefault(e => e.Text==storageNodeId && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Text == storageNodeId && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(entity, Is.Not.Null); } protected virtual void AdditionalSelectTest(Session session, int initialCountOfEntities) { var storageNodeId = session.StorageNodeId; - Dictionary> typesMap; - if (!map.TryGetValue(storageNodeId, out typesMap)) + if (!map.TryGetValue(storageNodeId, out var typesMap)) { throw new Exception(string.Format("Unknown node {0}. Probably you don't populate data", storageNodeId)); + } - if (NodeConfiguration!=NodeConfigurationType.MultischemaNodes) + if (NodeConfiguration != NodeConfigurationType.MultischemaNodes) { return; + } var type1BaseQuery = session.Query.All() .Select(e => new model.TestEntityDTO() {Id = e.Id, TypeId = e.TypeId, Text = e.Text, DatabaseName = e.DatabaseName, SchemaName = e.SchemaName}); @@ -355,50 +329,50 @@ protected virtual void AdditionalSelectTest(Session session, int initialCountOfE private Key[] Insert(Session session, int initialCountOfEntities) { var storageNodeId = session.StorageNodeId; - Dictionary> typesMap; - if (!map.TryGetValue(storageNodeId, out typesMap)) + if (!map.TryGetValue(storageNodeId, out var typesMap)) { throw new Exception(string.Format("Unknown node {0}. Probably you don't populate data", storageNodeId)); + } var text = string.Format("{0}_new", storageNodeId); - var a = new model.Part1.TestEntity1 {Text = text}; + var a = new model.Part1.TestEntity1 { Text = text }; var databaseAndSchema = typesMap[a.GetType()]; a.DatabaseName = databaseAndSchema.First; a.SchemaName = databaseAndSchema.Second; session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - a = session.Query.All().FirstOrDefault(e => e.Text == text && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + a = session.Query.All().FirstOrDefault(e => e.Text == text && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(a, Is.Not.Null); - var b = new model.Part2.TestEntity2 {Text = text}; + var b = new model.Part2.TestEntity2 { Text = text }; databaseAndSchema = typesMap[b.GetType()]; b.DatabaseName = databaseAndSchema.First; b.SchemaName = databaseAndSchema.Second; session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - b = session.Query.All().FirstOrDefault(e => e.Text==text && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + b = session.Query.All().FirstOrDefault(e => e.Text == text && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(b, Is.Not.Null); - var c = new model.Part3.TestEntity3 {Text = text}; + var c = new model.Part3.TestEntity3 { Text = text }; databaseAndSchema = typesMap[c.GetType()]; c.DatabaseName = databaseAndSchema.First; c.SchemaName = databaseAndSchema.Second; session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - c = session.Query.All().FirstOrDefault(e => e.Text==text && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + c = session.Query.All().FirstOrDefault(e => e.Text == text && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(c, Is.Not.Null); - var d = new model.Part4.TestEntity4 {Text = text}; + var d = new model.Part4.TestEntity4 { Text = text }; databaseAndSchema = typesMap[d.GetType()]; d.DatabaseName = databaseAndSchema.First; d.SchemaName = databaseAndSchema.Second; session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - d = session.Query.All().FirstOrDefault(e => e.Text==text && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + d = session.Query.All().FirstOrDefault(e => e.Text == text && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(d, Is.Not.Null); return new Key[] { a.Key, b.Key, c.Key, d.Key }; @@ -407,15 +381,15 @@ private Key[] Insert(Session session, int initialCountOfEntities) private void Update(Session session, Key[] createdKeys, int initialCountOfEntities) { var storageNodeId = session.StorageNodeId; - Dictionary> typesMap; - if (!map.TryGetValue(storageNodeId, out typesMap)) + if (!map.TryGetValue(storageNodeId, out var typesMap)) { throw new Exception(string.Format("Unknown node {0}. Probably you don't populate data", storageNodeId)); + } var updatedText = string.Format("{0}_new_updated", storageNodeId); var text = string.Format("{0}_new", storageNodeId); var databaseAndSchema = typesMap[typeof(model.Part1.TestEntity1)]; - var a = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[0] && e.Text==text); + var a = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[0] && e.Text == text); Assert.That(a, Is.Not.Null); Assert.That(a.DatabaseName, Is.EqualTo(databaseAndSchema.First)); Assert.That(a.SchemaName, Is.EqualTo(databaseAndSchema.Second)); @@ -424,15 +398,15 @@ private void Update(Session session, Key[] createdKeys, int initialCountOfEntiti session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==updatedText), Is.Not.Null); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==text), Is.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == updatedText), Is.Not.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == text), Is.Null); Assert.That( session.Query.All() - .FirstOrDefault(e => e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second), + .FirstOrDefault(e => e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second), Is.Not.Null); databaseAndSchema = typesMap[typeof(model.Part2.TestEntity2)]; - var b = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[1] && e.Text==text); + var b = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[1] && e.Text == text); Assert.That(b, Is.Not.Null); Assert.That(b.DatabaseName, Is.EqualTo(databaseAndSchema.First)); Assert.That(b.SchemaName, Is.EqualTo(databaseAndSchema.Second)); @@ -441,15 +415,15 @@ private void Update(Session session, Key[] createdKeys, int initialCountOfEntiti session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==updatedText), Is.Not.Null); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==text), Is.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == updatedText), Is.Not.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == text), Is.Null); Assert.That( session.Query.All() - .FirstOrDefault(e => e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second), + .FirstOrDefault(e => e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second), Is.Not.Null); databaseAndSchema = typesMap[typeof(model.Part3.TestEntity3)]; - var c = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[2] && e.Text==text); + var c = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[2] && e.Text == text); Assert.That(c, Is.Not.Null); Assert.That(c.DatabaseName, Is.EqualTo(databaseAndSchema.First)); Assert.That(c.SchemaName, Is.EqualTo(databaseAndSchema.Second)); @@ -458,15 +432,15 @@ private void Update(Session session, Key[] createdKeys, int initialCountOfEntiti session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==updatedText), Is.Not.Null); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==text), Is.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == updatedText), Is.Not.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == text), Is.Null); Assert.That( session.Query.All() - .FirstOrDefault(e => e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second), + .FirstOrDefault(e => e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second), Is.Not.Null); databaseAndSchema = typesMap[typeof(model.Part4.TestEntity4)]; - var d = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[3] && e.Text==text); + var d = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[3] && e.Text == text); Assert.That(d, Is.Not.Null); Assert.That(d.DatabaseName, Is.EqualTo(databaseAndSchema.First)); Assert.That(d.SchemaName, Is.EqualTo(databaseAndSchema.Second)); @@ -475,84 +449,84 @@ private void Update(Session session, Key[] createdKeys, int initialCountOfEntiti session.SaveChanges(); Assert.That(session.Query.All().Count(), Is.EqualTo(initialCountOfEntities + 1)); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==updatedText), Is.Not.Null); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==text), Is.Null); - Assert.That(session.Query.All().FirstOrDefault(e => e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second), Is.Not.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == updatedText), Is.Not.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == text), Is.Null); + Assert.That(session.Query.All().FirstOrDefault(e => e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second), Is.Not.Null); } private void Delete(Session session, Key[] createdKeys, int initialCountOfEntities) { var storageNodeId = session.StorageNodeId; - Dictionary> typesMap; - if (!map.TryGetValue(storageNodeId, out typesMap)) + if (!map.TryGetValue(storageNodeId, out var typesMap)) { throw new Exception(string.Format("Unknown node {0}. Probably you don't populate data", storageNodeId)); + } var updatedText = string.Format("{0}_new_updated", storageNodeId); - var databaseAndSchema = typesMap[typeof (model.Part1.TestEntity1)]; - var a = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[0] && e.Text==updatedText); + var databaseAndSchema = typesMap[typeof(model.Part1.TestEntity1)]; + var a = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[0] && e.Text == updatedText); Assert.That(a, Is.Not.Null); a = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[0] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[0] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(a, Is.Not.Null); a.Remove(); session.SaveChanges(); - databaseAndSchema = typesMap[typeof (model.Part2.TestEntity2)]; - var b = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[1] && e.Text==updatedText); + databaseAndSchema = typesMap[typeof(model.Part2.TestEntity2)]; + var b = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[1] && e.Text == updatedText); Assert.That(b, Is.Not.Null); b = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[1] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[1] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(b, Is.Not.Null); b.Remove(); session.SaveChanges(); - databaseAndSchema = typesMap[typeof (model.Part3.TestEntity3)]; - var c = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[2] && e.Text==updatedText); + databaseAndSchema = typesMap[typeof(model.Part3.TestEntity3)]; + var c = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[2] && e.Text == updatedText); Assert.That(c, Is.Not.Null); c = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[2] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[2] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(c, Is.Not.Null); c.Remove(); session.SaveChanges(); - databaseAndSchema = typesMap[typeof (model.Part4.TestEntity4)]; - var d = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[3] && e.Text==updatedText); + databaseAndSchema = typesMap[typeof(model.Part4.TestEntity4)]; + var d = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[3] && e.Text == updatedText); Assert.That(d, Is.Not.Null); d = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[3] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[3] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(d, Is.Not.Null); d.Remove(); session.SaveChanges(); - a = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[0] && e.Text==updatedText); + a = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[0] && e.Text == updatedText); Assert.That(a, Is.Null); a = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[0] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[0] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(a, Is.Null); - b = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[1] && e.Text==updatedText); + b = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[1] && e.Text == updatedText); Assert.That(b, Is.Null); b = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[1] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[1] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(b, Is.Null); - c = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[2] && e.Text==updatedText); + c = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[2] && e.Text == updatedText); Assert.That(c, Is.Null); c = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[2] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[2] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(c, Is.Null); - d = session.Query.All().FirstOrDefault(e => e.Key==createdKeys[3] && e.Text==updatedText); + d = session.Query.All().FirstOrDefault(e => e.Key == createdKeys[3] && e.Text == updatedText); Assert.That(d, Is.Null); d = session.Query.All() - .FirstOrDefault(e => e.Key==createdKeys[3] && e.Text==updatedText && e.DatabaseName==databaseAndSchema.First && e.SchemaName==databaseAndSchema.Second); + .FirstOrDefault(e => e.Key == createdKeys[3] && e.Text == updatedText && e.DatabaseName == databaseAndSchema.First && e.SchemaName == databaseAndSchema.Second); Assert.That(d, Is.Null); } } diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs index c935b6702c..4aba18e79b 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs @@ -1,4 +1,8 @@ -using System.Collections.Generic; +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + +using System.Collections.Generic; using System.Linq; using NUnit.Framework; using Xtensive.Orm.Configuration; @@ -7,12 +11,13 @@ namespace Xtensive.Orm.Tests.Storage.SchemaSharing.KeyGenerator { - public class SimpleTest : AutoBuildTest + public class SimpleTest { [OneTimeSetUp] - public void TestFixureSetUp() + public void TestFixureSetUp() => CheckRequirements(); + + protected virtual void CheckRequirements() { - CheckRequirements(); } [Test] @@ -20,21 +25,22 @@ public void MainTest() { using (var referenceDomain = BuildDomain(BuildConfiguration().UseRecreate())) { var skipParametersPerNode = GetSkipParameters(DomainUpgradeMode.Recreate); - foreach (var node in skipParametersPerNode.Keys.Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - referenceDomain.StorageNodeManager.AddNode(node.UseRecreate());//node is in recreate; + foreach (var node in skipParametersPerNode.Keys.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = referenceDomain.StorageNodeManager.AddNode(node.UseRecreate());//node is in recreate; + } var sequenceAccessor = referenceDomain.Services.Get(); - var intSequence = referenceDomain.Model.Types[typeof (model.Part1.TestEntity1)].Hierarchy.Key.Sequence; - var longSequence = referenceDomain.Model.Types[typeof (model.Part1.TestEntity2)].Hierarchy.Key.Sequence; + var intSequence = referenceDomain.Model.Types[typeof(model.Part1.TestEntity1)].Hierarchy.Key.Sequence; + var longSequence = referenceDomain.Model.Types[typeof(model.Part1.TestEntity2)].Hierarchy.Key.Sequence; foreach (var node in skipParametersPerNode) { - using (var session = referenceDomain.OpenSession()) { - session.SelectStorageNode(node.Key.NodeId); + var selectedNode = referenceDomain.SelectStorageNode(node.Key.NodeId); + using (var session = selectedNode.OpenSession()) { var skipCount = node.Value; for (int i = 0; i < skipCount; i++) { - sequenceAccessor.NextBulk(intSequence, session); - sequenceAccessor.NextBulk(longSequence, session); + _ = sequenceAccessor.NextBulk(intSequence, session); + _ = sequenceAccessor.NextBulk(longSequence, session); } } } @@ -42,17 +48,18 @@ public void MainTest() using (var testDomain = BuildDomain(BuildConfiguration().UsePerformSafely().MakeNodesShareSchema())) { var skipParametersPerNode = GetSkipParameters(DomainUpgradeMode.PerformSafely); - foreach (var node in skipParametersPerNode.Keys.Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - testDomain.StorageNodeManager.AddNode(node.UsePerformSafely()); + foreach (var node in skipParametersPerNode.Keys.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = testDomain.StorageNodeManager.AddNode(node.UsePerformSafely()); + } var sequenceAccessor = testDomain.Services.Get(); - var intSequence = testDomain.Model.Types[typeof (model.Part1.TestEntity1)].Hierarchy.Key.Sequence; - var longSequence = testDomain.Model.Types[typeof (model.Part1.TestEntity2)].Hierarchy.Key.Sequence; + var intSequence = testDomain.Model.Types[typeof(model.Part1.TestEntity1)].Hierarchy.Key.Sequence; + var longSequence = testDomain.Model.Types[typeof(model.Part1.TestEntity2)].Hierarchy.Key.Sequence; foreach (var node in skipParametersPerNode) { - using (var session = testDomain.OpenSession()) { - session.SelectStorageNode(node.Key.NodeId); + var selectedNode = testDomain.SelectStorageNode(node.Key.NodeId); + using (var session = selectedNode.OpenSession()) { var expectedIntOffset = node.Value * 128 + 1; var expectedLongOffset = node.Value * 128 + 1; @@ -66,15 +73,20 @@ public void MainTest() } } - protected override DomainConfiguration BuildConfiguration() + protected Domain BuildDomain(DomainConfiguration configuration) + { + return Domain.Build(configuration); + } + + protected virtual DomainConfiguration BuildConfiguration() { - var configuration = base.BuildConfiguration(); + var configuration = DomainConfigurationFactory.Create(); configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (model.Part1.TestEntity1).Assembly, typeof (model.Part1.TestEntity1).Namespace); - configuration.Types.Register(typeof (model.Part2.TestEntity3).Assembly, typeof (model.Part2.TestEntity3).Namespace); - configuration.Types.Register(typeof (model.Part3.TestEntity5).Assembly, typeof (model.Part3.TestEntity5).Namespace); - configuration.Types.Register(typeof (model.Part4.TestEntity7).Assembly, typeof (model.Part4.TestEntity7).Namespace); + configuration.Types.Register(typeof(model.Part1.TestEntity1).Assembly, typeof(model.Part1.TestEntity1).Namespace); + configuration.Types.Register(typeof(model.Part2.TestEntity3).Assembly, typeof(model.Part2.TestEntity3).Namespace); + configuration.Types.Register(typeof(model.Part3.TestEntity5).Assembly, typeof(model.Part3.TestEntity5).Namespace); + configuration.Types.Register(typeof(model.Part4.TestEntity7).Assembly, typeof(model.Part4.TestEntity7).Namespace); return configuration; } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs index 0c670a25d2..6dfdbfb9c9 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs @@ -38,8 +38,8 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); populator.Run(); @@ -58,8 +58,8 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); checker.Run(session); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs index 00b0220b67..fc694c168f 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs @@ -38,13 +38,12 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var populator = new ModelPopulator(); - populator.Run(); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var populator = new ModelPopulator(); + populator.Run(); + transaction.Complete(); } } } @@ -58,12 +57,11 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var checker = new ModelChecker(); - checker.Run(session); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var checker = new ModelChecker(); + checker.Run(session); } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs index 46d103d748..8fd0942d47 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs @@ -38,8 +38,8 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); populator.Run(); @@ -58,12 +58,11 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var checker = new ModelChecker(); - checker.Run(session); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var checker = new ModelChecker(); + checker.Run(session); } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs index 3684ed6244..0f5ee6fe94 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs @@ -48,13 +48,12 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var populator = new ModelPopulator(); - populator.Run(); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var populator = new ModelPopulator(); + populator.Run(); + transaction.Complete(); } } } @@ -67,12 +66,11 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var checker = new ModelChecker(); - checker.Run(session); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var checker = new ModelChecker(); + checker.Run(session); } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs index c6bbe4d910..1868d625ba 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs @@ -51,13 +51,12 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var populator = new ModelPopulator(); - populator.Run(); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var populator = new ModelPopulator(); + populator.Run(); + transaction.Complete(); } } } @@ -70,12 +69,11 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(node); - using (var transaction = session.OpenTransaction()) { - var checker = new ModelChecker(); - checker.Run(session); - } + var selectedNode = domain.SelectStorageNode(node); + using (var session = domain.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var checker = new ModelChecker(); + checker.Run(session); } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs index d959cf9e4d..554e201ed3 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2016-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2016.02.24 @@ -46,10 +46,7 @@ public void CatalogComparisonTest() protected abstract ForeignKeyMode GetForeignKeyMode(); - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multischema); - } + protected override void CheckRequirements() => Require.AllFeaturesSupported(ProviderFeatures.Multischema); protected override void PopulateData(Domain domain) { @@ -79,166 +76,168 @@ protected override DomainConfiguration BuildConfiguration() private void PopulateNodeData(Domain domain, string nodeIdentifier) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeIdentifier); - using (var transaction = session.OpenTransaction()) { - CreateEntities(); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(nodeIdentifier); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + CreateEntities(); + transaction.Complete(); } } private void TestNode(Domain domain, string nodeIdentifier) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeIdentifier); - using (var transaction = session.OpenTransaction()) { - var countriesCount = session.Query.All().Count(); - Assert.That(countriesCount, Is.EqualTo(countries.Length)); - foreach (var country in countries) { - var c = session.Query.All().FirstOrDefault(el => el.Value==country); - Assert.That(c, Is.Not.Null); - Assert.That(c.Value, Is.EqualTo(country)); - } - - var positionsCount = session.Query.All().Count(); - Assert.That(positionsCount, Is.EqualTo(positions.Length)); - foreach (var position in positions) { - var p = session.Query.All().FirstOrDefault(el => el.Value==position); - Assert.That(p, Is.Not.Null); - Assert.That(p.Value, Is.EqualTo(position)); - } - - var propertiesCount = session.Query.All().Count(); - Assert.That(propertiesCount, Is.EqualTo(2)); - - var hashersCount = session.Query.All().Count(); - Assert.That(hashersCount, Is.EqualTo(1)); - - var md5Count = session.Query.All().Count(); - Assert.That(md5Count, Is.EqualTo(1)); - - var providersCount = session.Query.All().Count(); - Assert.That(providersCount, Is.EqualTo(3)); - - var buildInProvidersCount = session.Query.All().Count(); - Assert.That(buildInProvidersCount, Is.EqualTo(1)); - var buildInProvider = session.Query.All().First(); - Assert.That(buildInProvider.Name, Is.EqualTo("SimpleBuildInProvider")); - - var oauthProvidersCount = session.Query.All().Count(); - Assert.That(oauthProvidersCount, Is.EqualTo(1)); - - var googleProvidersCount = session.Query.All().Count(); - Assert.That(googleProvidersCount, Is.EqualTo(1)); - - var openIdProvidersCount = session.Query.All().Count(); - Assert.That(openIdProvidersCount, Is.EqualTo(1)); - - var aolProvidersCount = session.Query.All().Count(); - Assert.That(aolProvidersCount, Is.EqualTo(1)); - - var personsCount = session.Query.All().Count(); - var usersCount = session.Query.All().Count(); - Assert.That(personsCount, Is.EqualTo(names.Length)); - Assert.That(usersCount, Is.EqualTo(emails.Length)); - Assert.That(usersCount, Is.EqualTo(personsCount)); - foreach (var name in names) { - var firstName = name.Split(' ')[0]; - var lastName = name.Split(' ')[1]; - var person = session.Query.All().FirstOrDefault(el => el.FirstName==firstName && el.LastName==lastName); - Assert.That(person, Is.Not.Null); - Assert.That(person.User, Is.Not.Null); - Assert.That(emails.Contains(person.User.Email), Is.True); - Assert.That(person.User.AuthorizationInfos.Count(), Is.EqualTo(1)); - } - - var authorizationInfosCount = session.Query.All().Count(); - Assert.That(authorizationInfosCount, Is.EqualTo(3)); - - var xCount = session.Query.All().Count(); - Assert.That(xCount, Is.EqualTo(1)); - var x = session.Query.All().First(); - Assert.That(x.FBool, Is.True); - Assert.That(x.FByte, Is.EqualTo(1)); - Assert.That(x.FSByte, Is.EqualTo(1)); - Assert.That(x.FShort, Is.EqualTo(1)); - Assert.That(x.FUShort, Is.EqualTo(1)); - Assert.That(x.FInt, Is.EqualTo(1)); - Assert.That(x.FUInt, Is.EqualTo(1)); - Assert.That(x.FLong, Is.EqualTo(1)); - Assert.That(x.FULong, Is.EqualTo(1)); - Assert.That(x.FFloat, Is.EqualTo(1.0f)); - Assert.That(x.FDouble, Is.EqualTo(1.0d)); - Assert.That(x.FDecimal, Is.EqualTo(1)); - Assert.That(x.FDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); - Assert.That(x.FTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); - Assert.That(x.FString, Is.EqualTo(1.ToString())); - Assert.That(x.FLongString, Is.EqualTo(1.ToString())); - Assert.That(x.FEByte, Is.EqualTo(EByte.Min)); - Assert.That(x.FESByte, Is.EqualTo(ESByte.Min)); - Assert.That(x.FEShort, Is.EqualTo(EShort.Min)); - Assert.That(x.FEUShort, Is.EqualTo(EUShort.Min)); - Assert.That(x.FEInt, Is.EqualTo(EInt.Min)); - Assert.That(x.FEUInt, Is.EqualTo(EUInt.Min)); - Assert.That(x.FELong, Is.EqualTo(ELong.Min)); - Assert.That(x.FEULong, Is.EqualTo(EULong.Min)); - - Assert.That(x.FNBool, Is.EqualTo(true)); - Assert.That(x.FNByte, Is.EqualTo(1)); - Assert.That(x.FNSByte, Is.EqualTo(1)); - Assert.That(x.FNShort, Is.EqualTo(1)); - Assert.That(x.FNUShort, Is.EqualTo(1)); - Assert.That(x.FNInt, Is.EqualTo(1)); - Assert.That(x.FNUInt, Is.EqualTo(1)); - Assert.That(x.FNLong, Is.EqualTo(1)); - Assert.That(x.FNULong, Is.EqualTo(1)); - Assert.That(x.FNFloat, Is.EqualTo(1.0f)); - Assert.That(x.FNDouble, Is.EqualTo(1.0d)); - Assert.That(x.FNDecimal, Is.EqualTo(1)); - Assert.That(x.FNDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); - Assert.That(x.FNTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); - Assert.That(x.FNEByte, Is.EqualTo(EByte.Min)); - Assert.That(x.FNESByte, Is.EqualTo(ESByte.Min)); - Assert.That(x.FNEShort, Is.EqualTo(EShort.Min)); - Assert.That(x.FNEUShort, Is.EqualTo(EUShort.Min)); - Assert.That(x.FNEInt, Is.EqualTo(EInt.Min)); - Assert.That(x.FNEUInt, Is.EqualTo(EUInt.Min)); - Assert.That(x.FNELong, Is.EqualTo(ELong.Min)); - Assert.That(x.FNEULong, Is.EqualTo(EULong.Min)); - Assert.That(x.Ref, Is.Not.Null); - - for (int i = 0; i < 200; i++) - new Country {Value = string.Format("Country{0}", i)}; - transaction.Complete(); + var selectedNode = domain.SelectStorageNode(nodeIdentifier); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var countriesCount = session.Query.All().Count(); + Assert.That(countriesCount, Is.EqualTo(countries.Length)); + foreach (var country in countries) { + var c = session.Query.All().FirstOrDefault(el => el.Value == country); + Assert.That(c, Is.Not.Null); + Assert.That(c.Value, Is.EqualTo(country)); } + + var positionsCount = session.Query.All().Count(); + Assert.That(positionsCount, Is.EqualTo(positions.Length)); + foreach (var position in positions) { + var p = session.Query.All().FirstOrDefault(el => el.Value == position); + Assert.That(p, Is.Not.Null); + Assert.That(p.Value, Is.EqualTo(position)); + } + + var propertiesCount = session.Query.All().Count(); + Assert.That(propertiesCount, Is.EqualTo(2)); + + var hashersCount = session.Query.All().Count(); + Assert.That(hashersCount, Is.EqualTo(1)); + + var md5Count = session.Query.All().Count(); + Assert.That(md5Count, Is.EqualTo(1)); + + var providersCount = session.Query.All().Count(); + Assert.That(providersCount, Is.EqualTo(3)); + + var buildInProvidersCount = session.Query.All().Count(); + Assert.That(buildInProvidersCount, Is.EqualTo(1)); + var buildInProvider = session.Query.All().First(); + Assert.That(buildInProvider.Name, Is.EqualTo("SimpleBuildInProvider")); + + var oauthProvidersCount = session.Query.All().Count(); + Assert.That(oauthProvidersCount, Is.EqualTo(1)); + + var googleProvidersCount = session.Query.All().Count(); + Assert.That(googleProvidersCount, Is.EqualTo(1)); + + var openIdProvidersCount = session.Query.All().Count(); + Assert.That(openIdProvidersCount, Is.EqualTo(1)); + + var aolProvidersCount = session.Query.All().Count(); + Assert.That(aolProvidersCount, Is.EqualTo(1)); + + var personsCount = session.Query.All().Count(); + var usersCount = session.Query.All().Count(); + Assert.That(personsCount, Is.EqualTo(names.Length)); + Assert.That(usersCount, Is.EqualTo(emails.Length)); + Assert.That(usersCount, Is.EqualTo(personsCount)); + foreach (var name in names) { + var firstName = name.Split(' ')[0]; + var lastName = name.Split(' ')[1]; + var person = session.Query.All().FirstOrDefault(el => el.FirstName == firstName && el.LastName == lastName); + Assert.That(person, Is.Not.Null); + Assert.That(person.User, Is.Not.Null); + Assert.That(emails.Contains(person.User.Email), Is.True); + Assert.That(person.User.AuthorizationInfos.Count(), Is.EqualTo(1)); + } + + var authorizationInfosCount = session.Query.All().Count(); + Assert.That(authorizationInfosCount, Is.EqualTo(3)); + + var xCount = session.Query.All().Count(); + Assert.That(xCount, Is.EqualTo(1)); + var x = session.Query.All().First(); + Assert.That(x.FBool, Is.True); + Assert.That(x.FByte, Is.EqualTo(1)); + Assert.That(x.FSByte, Is.EqualTo(1)); + Assert.That(x.FShort, Is.EqualTo(1)); + Assert.That(x.FUShort, Is.EqualTo(1)); + Assert.That(x.FInt, Is.EqualTo(1)); + Assert.That(x.FUInt, Is.EqualTo(1)); + Assert.That(x.FLong, Is.EqualTo(1)); + Assert.That(x.FULong, Is.EqualTo(1)); + Assert.That(x.FFloat, Is.EqualTo(1.0f)); + Assert.That(x.FDouble, Is.EqualTo(1.0d)); + Assert.That(x.FDecimal, Is.EqualTo(1)); + Assert.That(x.FDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); + Assert.That(x.FTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); + Assert.That(x.FString, Is.EqualTo(1.ToString())); + Assert.That(x.FLongString, Is.EqualTo(1.ToString())); + Assert.That(x.FEByte, Is.EqualTo(EByte.Min)); + Assert.That(x.FESByte, Is.EqualTo(ESByte.Min)); + Assert.That(x.FEShort, Is.EqualTo(EShort.Min)); + Assert.That(x.FEUShort, Is.EqualTo(EUShort.Min)); + Assert.That(x.FEInt, Is.EqualTo(EInt.Min)); + Assert.That(x.FEUInt, Is.EqualTo(EUInt.Min)); + Assert.That(x.FELong, Is.EqualTo(ELong.Min)); + Assert.That(x.FEULong, Is.EqualTo(EULong.Min)); + + Assert.That(x.FNBool, Is.EqualTo(true)); + Assert.That(x.FNByte, Is.EqualTo(1)); + Assert.That(x.FNSByte, Is.EqualTo(1)); + Assert.That(x.FNShort, Is.EqualTo(1)); + Assert.That(x.FNUShort, Is.EqualTo(1)); + Assert.That(x.FNInt, Is.EqualTo(1)); + Assert.That(x.FNUInt, Is.EqualTo(1)); + Assert.That(x.FNLong, Is.EqualTo(1)); + Assert.That(x.FNULong, Is.EqualTo(1)); + Assert.That(x.FNFloat, Is.EqualTo(1.0f)); + Assert.That(x.FNDouble, Is.EqualTo(1.0d)); + Assert.That(x.FNDecimal, Is.EqualTo(1)); + Assert.That(x.FNDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); + Assert.That(x.FNTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); + Assert.That(x.FNEByte, Is.EqualTo(EByte.Min)); + Assert.That(x.FNESByte, Is.EqualTo(ESByte.Min)); + Assert.That(x.FNEShort, Is.EqualTo(EShort.Min)); + Assert.That(x.FNEUShort, Is.EqualTo(EUShort.Min)); + Assert.That(x.FNEInt, Is.EqualTo(EInt.Min)); + Assert.That(x.FNEUInt, Is.EqualTo(EUInt.Min)); + Assert.That(x.FNELong, Is.EqualTo(ELong.Min)); + Assert.That(x.FNEULong, Is.EqualTo(EULong.Min)); + Assert.That(x.Ref, Is.Not.Null); + + for (var i = 0; i < 200; i++) { + _ = new Country { Value = string.Format("Country{0}", i) }; + } + + transaction.Complete(); } } private void CreateEntities() { - foreach (var position in positions) - new Position {Value = position}; + foreach (var position in positions) { + _ = new Position { Value = position }; + } - foreach (var country in countries) - new Country {Value = country}; + foreach (var country in countries) { + _ = new Country { Value = country }; + } - new SimpleFilterWithProperty {TestField = "hello world!"}; - new SimpleFilterWithProperty {TestField = "hello world!!"}; + _ = new SimpleFilterWithProperty { TestField = "hello world!" }; + _ = new SimpleFilterWithProperty { TestField = "hello world!!" }; var md5hash = new MD5Hash(); var buildInProvider = new BuildInProviderInfo(md5hash); - var googleProvider = new GoogleOAuthProvider(md5hash) {Url = "google.com"}; - var aolProvider = new AolOpenIdProviderInfo(md5hash) {Url = "aol.com"}; - var providers = new ProviderInfo[] {buildInProvider, googleProvider, aolProvider}; + var googleProvider = new GoogleOAuthProvider(md5hash) { Url = "google.com" }; + var aolProvider = new AolOpenIdProviderInfo(md5hash) { Url = "aol.com" }; + var providers = new ProviderInfo[] { buildInProvider, googleProvider, aolProvider }; for (var index = 0; index < names.Length; index++) { - var user = new User {Email = emails[index]}; - user.Person = new Person {FirstName = names[index].Split(' ')[0], LastName = names[index].Split(' ')[1]}; - user.AuthorizationInfos.Add(new AuthorizationInfo {Provider = providers[index]}); + var user = new User { Email = emails[index] }; + user.Person = new Person { FirstName = names[index].Split(' ')[0], LastName = names[index].Split(' ')[1] }; + _ = user.AuthorizationInfos.Add(new AuthorizationInfo { Provider = providers[index] }); } - new XType { + _ = new XType { FBool = true, FByte = 1, FSByte = 1, diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs index 523ca061cf..b120b8ce73 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2016 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2016-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2016.02.24 @@ -49,10 +49,7 @@ public void CatalogComparisonTest() protected abstract ForeignKeyMode GetForeignKeyMode(); - protected override void CheckRequirements() - { - Require.AllFeaturesSupported(ProviderFeatures.Multischema); - } + protected override void CheckRequirements() => Require.AllFeaturesSupported(ProviderFeatures.Multischema); protected override void PopulateData(Domain domain) { @@ -82,152 +79,154 @@ protected override DomainConfiguration BuildConfiguration() private void PopulateNodeData(Domain domain, string nodeIdentifier) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeIdentifier); - using (var transaction = session.OpenTransaction()) { - CreateEntities(); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(nodeIdentifier); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + CreateEntities(); + transaction.Complete(); } } private void TestNode(Domain domain, string nodeIdentifier) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeIdentifier); - using (var transaction = session.OpenTransaction()) { - var countriesCount = session.Query.All().Count(); - Assert.That(countriesCount, Is.EqualTo(countries.Length)); - foreach (var country in countries) { - var c = session.Query.All().FirstOrDefault(el => el.Value==country); - Assert.That(c, Is.Not.Null); - Assert.That(c.Value, Is.EqualTo(country)); - } - - var positionsCount = session.Query.All().Count(); - Assert.That(positionsCount, Is.EqualTo(positions.Length)); - foreach (var position in positions) { - var p = session.Query.All().FirstOrDefault(el => el.Value==position); - Assert.That(p, Is.Not.Null); - Assert.That(p.Value, Is.EqualTo(position)); - } - - var propertiesCount = session.Query.All().Count(); - Assert.That(propertiesCount, Is.EqualTo(2)); - - var hashersCount = session.Query.All().Count(); - Assert.That(hashersCount, Is.EqualTo(1)); - - var md5Count = session.Query.All().Count(); - Assert.That(md5Count, Is.EqualTo(1)); - - var providersCount = session.Query.All().Count(); - Assert.That(providersCount, Is.EqualTo(3)); - - var buildInProvidersCount = session.Query.All().Count(); - Assert.That(buildInProvidersCount, Is.EqualTo(1)); - var buildInProvider = session.Query.All().First(); - Assert.That(buildInProvider.Name, Is.EqualTo("SimpleBuildInProvider")); - - var oauthProvidersCount = session.Query.All().Count(); - Assert.That(oauthProvidersCount, Is.EqualTo(1)); - - var googleProvidersCount = session.Query.All().Count(); - Assert.That(googleProvidersCount, Is.EqualTo(1)); - - var openIdProvidersCount = session.Query.All().Count(); - Assert.That(openIdProvidersCount, Is.EqualTo(1)); - - var aolProvidersCount = session.Query.All().Count(); - Assert.That(aolProvidersCount, Is.EqualTo(1)); - - var personsCount = session.Query.All().Count(); - var usersCount = session.Query.All().Count(); - Assert.That(personsCount, Is.EqualTo(names.Length)); - Assert.That(usersCount, Is.EqualTo(emails.Length)); - Assert.That(usersCount, Is.EqualTo(personsCount)); - foreach (var name in names) { - var firstName = name.Split(' ')[0]; - var lastName = name.Split(' ')[1]; - var person = session.Query.All().FirstOrDefault(el => el.FirstName==firstName && el.LastName==lastName); - Assert.That(person, Is.Not.Null); - Assert.That(person.User, Is.Not.Null); - Assert.That(emails.Contains(person.User.Email), Is.True); - Assert.That(person.User.AuthorizationInfos.Count(), Is.EqualTo(1)); - } - - var authorizationInfosCount = session.Query.All().Count(); - Assert.That(authorizationInfosCount, Is.EqualTo(3)); - - var xCount = session.Query.All().Count(); - Assert.That(xCount, Is.EqualTo(1)); - var x = session.Query.All().First(); - Assert.That(x.FBool, Is.True); - Assert.That(x.FByte, Is.EqualTo(1)); - Assert.That(x.FSByte, Is.EqualTo(1)); - Assert.That(x.FShort, Is.EqualTo(1)); - Assert.That(x.FUShort, Is.EqualTo(1)); - Assert.That(x.FInt, Is.EqualTo(1)); - Assert.That(x.FUInt, Is.EqualTo(1)); - Assert.That(x.FLong, Is.EqualTo(1)); - Assert.That(x.FULong, Is.EqualTo(1)); - Assert.That(x.FFloat, Is.EqualTo(1.0f)); - Assert.That(x.FDouble, Is.EqualTo(1.0d)); - Assert.That(x.FDecimal, Is.EqualTo(1)); - Assert.That(x.FDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); - Assert.That(x.FTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); - Assert.That(x.FString, Is.EqualTo(1.ToString())); - Assert.That(x.FLongString, Is.EqualTo(1.ToString())); - Assert.That(x.FEByte, Is.EqualTo(EByte.Min)); - Assert.That(x.FESByte, Is.EqualTo(ESByte.Min)); - Assert.That(x.FEShort, Is.EqualTo(EShort.Min)); - Assert.That(x.FEUShort, Is.EqualTo(EUShort.Min)); - Assert.That(x.FEInt, Is.EqualTo(EInt.Min)); - Assert.That(x.FEUInt, Is.EqualTo(EUInt.Min)); - Assert.That(x.FELong, Is.EqualTo(ELong.Min)); - Assert.That(x.FEULong, Is.EqualTo(EULong.Min)); - - Assert.That(x.FNBool, Is.EqualTo(true)); - Assert.That(x.FNByte, Is.EqualTo(1)); - Assert.That(x.FNSByte, Is.EqualTo(1)); - Assert.That(x.FNShort, Is.EqualTo(1)); - Assert.That(x.FNUShort, Is.EqualTo(1)); - Assert.That(x.FNInt, Is.EqualTo(1)); - Assert.That(x.FNUInt, Is.EqualTo(1)); - Assert.That(x.FNLong, Is.EqualTo(1)); - Assert.That(x.FNULong, Is.EqualTo(1)); - Assert.That(x.FNFloat, Is.EqualTo(1.0f)); - Assert.That(x.FNDouble, Is.EqualTo(1.0d)); - Assert.That(x.FNDecimal, Is.EqualTo(1)); - Assert.That(x.FNDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); - Assert.That(x.FNTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); - Assert.That(x.FNEByte, Is.EqualTo(EByte.Min)); - Assert.That(x.FNESByte, Is.EqualTo(ESByte.Min)); - Assert.That(x.FNEShort, Is.EqualTo(EShort.Min)); - Assert.That(x.FNEUShort, Is.EqualTo(EUShort.Min)); - Assert.That(x.FNEInt, Is.EqualTo(EInt.Min)); - Assert.That(x.FNEUInt, Is.EqualTo(EUInt.Min)); - Assert.That(x.FNELong, Is.EqualTo(ELong.Min)); - Assert.That(x.FNEULong, Is.EqualTo(EULong.Min)); - Assert.That(x.Ref, Is.Not.Null); - - for (int i = 0; i < 200; i++) - new Country {Value = string.Format("Country{0}", i)}; - transaction.Complete(); + var selectedNode = domain.SelectStorageNode(nodeIdentifier); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var countriesCount = session.Query.All().Count(); + Assert.That(countriesCount, Is.EqualTo(countries.Length)); + foreach (var country in countries) { + var c = session.Query.All().FirstOrDefault(el => el.Value == country); + Assert.That(c, Is.Not.Null); + Assert.That(c.Value, Is.EqualTo(country)); + } + + var positionsCount = session.Query.All().Count(); + Assert.That(positionsCount, Is.EqualTo(positions.Length)); + foreach (var position in positions) { + var p = session.Query.All().FirstOrDefault(el => el.Value == position); + Assert.That(p, Is.Not.Null); + Assert.That(p.Value, Is.EqualTo(position)); } + + var propertiesCount = session.Query.All().Count(); + Assert.That(propertiesCount, Is.EqualTo(2)); + + var hashersCount = session.Query.All().Count(); + Assert.That(hashersCount, Is.EqualTo(1)); + + var md5Count = session.Query.All().Count(); + Assert.That(md5Count, Is.EqualTo(1)); + + var providersCount = session.Query.All().Count(); + Assert.That(providersCount, Is.EqualTo(3)); + + var buildInProvidersCount = session.Query.All().Count(); + Assert.That(buildInProvidersCount, Is.EqualTo(1)); + var buildInProvider = session.Query.All().First(); + Assert.That(buildInProvider.Name, Is.EqualTo("SimpleBuildInProvider")); + + var oauthProvidersCount = session.Query.All().Count(); + Assert.That(oauthProvidersCount, Is.EqualTo(1)); + + var googleProvidersCount = session.Query.All().Count(); + Assert.That(googleProvidersCount, Is.EqualTo(1)); + + var openIdProvidersCount = session.Query.All().Count(); + Assert.That(openIdProvidersCount, Is.EqualTo(1)); + + var aolProvidersCount = session.Query.All().Count(); + Assert.That(aolProvidersCount, Is.EqualTo(1)); + + var personsCount = session.Query.All().Count(); + var usersCount = session.Query.All().Count(); + Assert.That(personsCount, Is.EqualTo(names.Length)); + Assert.That(usersCount, Is.EqualTo(emails.Length)); + Assert.That(usersCount, Is.EqualTo(personsCount)); + foreach (var name in names) { + var firstName = name.Split(' ')[0]; + var lastName = name.Split(' ')[1]; + var person = session.Query.All().FirstOrDefault(el => el.FirstName == firstName && el.LastName == lastName); + Assert.That(person, Is.Not.Null); + Assert.That(person.User, Is.Not.Null); + Assert.That(emails.Contains(person.User.Email), Is.True); + Assert.That(person.User.AuthorizationInfos.Count(), Is.EqualTo(1)); + } + + var authorizationInfosCount = session.Query.All().Count(); + Assert.That(authorizationInfosCount, Is.EqualTo(3)); + + var xCount = session.Query.All().Count(); + Assert.That(xCount, Is.EqualTo(1)); + var x = session.Query.All().First(); + Assert.That(x.FBool, Is.True); + Assert.That(x.FByte, Is.EqualTo(1)); + Assert.That(x.FSByte, Is.EqualTo(1)); + Assert.That(x.FShort, Is.EqualTo(1)); + Assert.That(x.FUShort, Is.EqualTo(1)); + Assert.That(x.FInt, Is.EqualTo(1)); + Assert.That(x.FUInt, Is.EqualTo(1)); + Assert.That(x.FLong, Is.EqualTo(1)); + Assert.That(x.FULong, Is.EqualTo(1)); + Assert.That(x.FFloat, Is.EqualTo(1.0f)); + Assert.That(x.FDouble, Is.EqualTo(1.0d)); + Assert.That(x.FDecimal, Is.EqualTo(1)); + Assert.That(x.FDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); + Assert.That(x.FTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); + Assert.That(x.FString, Is.EqualTo(1.ToString())); + Assert.That(x.FLongString, Is.EqualTo(1.ToString())); + Assert.That(x.FEByte, Is.EqualTo(EByte.Min)); + Assert.That(x.FESByte, Is.EqualTo(ESByte.Min)); + Assert.That(x.FEShort, Is.EqualTo(EShort.Min)); + Assert.That(x.FEUShort, Is.EqualTo(EUShort.Min)); + Assert.That(x.FEInt, Is.EqualTo(EInt.Min)); + Assert.That(x.FEUInt, Is.EqualTo(EUInt.Min)); + Assert.That(x.FELong, Is.EqualTo(ELong.Min)); + Assert.That(x.FEULong, Is.EqualTo(EULong.Min)); + + Assert.That(x.FNBool, Is.EqualTo(true)); + Assert.That(x.FNByte, Is.EqualTo(1)); + Assert.That(x.FNSByte, Is.EqualTo(1)); + Assert.That(x.FNShort, Is.EqualTo(1)); + Assert.That(x.FNUShort, Is.EqualTo(1)); + Assert.That(x.FNInt, Is.EqualTo(1)); + Assert.That(x.FNUInt, Is.EqualTo(1)); + Assert.That(x.FNLong, Is.EqualTo(1)); + Assert.That(x.FNULong, Is.EqualTo(1)); + Assert.That(x.FNFloat, Is.EqualTo(1.0f)); + Assert.That(x.FNDouble, Is.EqualTo(1.0d)); + Assert.That(x.FNDecimal, Is.EqualTo(1)); + Assert.That(x.FNDateTime, Is.EqualTo(new DateTime(2001, 1, 1, 1, 1, 1))); + Assert.That(x.FNTimeSpan, Is.EqualTo(new TimeSpan(1, 1, 1, 1))); + Assert.That(x.FNEByte, Is.EqualTo(EByte.Min)); + Assert.That(x.FNESByte, Is.EqualTo(ESByte.Min)); + Assert.That(x.FNEShort, Is.EqualTo(EShort.Min)); + Assert.That(x.FNEUShort, Is.EqualTo(EUShort.Min)); + Assert.That(x.FNEInt, Is.EqualTo(EInt.Min)); + Assert.That(x.FNEUInt, Is.EqualTo(EUInt.Min)); + Assert.That(x.FNELong, Is.EqualTo(ELong.Min)); + Assert.That(x.FNEULong, Is.EqualTo(EULong.Min)); + Assert.That(x.Ref, Is.Not.Null); + + for (var i = 0; i < 200; i++) { + _ = new Country { Value = string.Format("Country{0}", i) }; + } + + transaction.Complete(); } } private void CreateEntities() { - foreach (var position in positions) - new Position {Value = position}; + foreach (var position in positions) { + _ = new Position { Value = position }; + } - foreach (var country in countries) - new Country {Value = country}; + foreach (var country in countries) { + _ = new Country { Value = country }; + } - new SimpleFilterWithProperty {TestField = "hello world!"}; - new SimpleFilterWithProperty {TestField = "hello world!!"}; + _ = new SimpleFilterWithProperty {TestField = "hello world!"}; + _ = new SimpleFilterWithProperty {TestField = "hello world!!"}; var md5hash = new MD5Hash(); var buildInProvider = new BuildInProviderInfo(md5hash); @@ -238,10 +237,10 @@ private void CreateEntities() for (var index = 0; index < names.Length; index++) { var user = new User {Email = emails[index]}; user.Person = new Person {FirstName = names[index].Split(' ')[0], LastName = names[index].Split(' ')[1]}; - user.AuthorizationInfos.Add(new AuthorizationInfo {Provider = providers[index]}); + _ = user.AuthorizationInfos.Add(new AuthorizationInfo {Provider = providers[index]}); } - new XType { + _ = new XType { FBool = true, FByte = 1, FSByte = 1, @@ -298,33 +297,21 @@ private void CreateEntities() public class SingleSchemaNodeWithoutForeignKeysTest : SingleSchemaNodeTest { - protected override ForeignKeyMode GetForeignKeyMode() - { - return ForeignKeyMode.None; - } + protected override ForeignKeyMode GetForeignKeyMode() => ForeignKeyMode.None; } public class SingleSchemaNodeHierarchyForeignKeysTest : SingleSchemaNodeTest { - protected override ForeignKeyMode GetForeignKeyMode() - { - return ForeignKeyMode.Hierarchy; - } + protected override ForeignKeyMode GetForeignKeyMode() => ForeignKeyMode.Hierarchy; } public class SingleSchemaNodeReferenceForeignKeysTest : SingleSchemaNodeTest { - protected override ForeignKeyMode GetForeignKeyMode() - { - return ForeignKeyMode.Reference; - } + protected override ForeignKeyMode GetForeignKeyMode() => ForeignKeyMode.Reference; } public class SingleSchemaNodeAllForeignKeysTest : SingleSchemaNodeTest { - protected override ForeignKeyMode GetForeignKeyMode() - { - return ForeignKeyMode.All; - } + protected override ForeignKeyMode GetForeignKeyMode() => ForeignKeyMode.All; } } \ No newline at end of file diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs index 88bde14163..d02c51dc65 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.03.03 @@ -34,76 +34,41 @@ public override void TestFixtureSetUp() #region Tests [Test] - public void PerformWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Perform, false); - } + public void PerformWithoutSharingTest() => RunTest(DomainUpgradeMode.Perform, false); [Test] - public void PerformWithSharingTest() - { - RunTest(DomainUpgradeMode.Perform, true); - } + public void PerformWithSharingTest() => RunTest(DomainUpgradeMode.Perform, true); [Test] - public void PerformSafelyWithoutSharingTest() - { - RunTest(DomainUpgradeMode.PerformSafely, false); - } + public void PerformSafelyWithoutSharingTest() => RunTest(DomainUpgradeMode.PerformSafely, false); [Test] - public void PerformSafelyWithSharing() - { - RunTest(DomainUpgradeMode.PerformSafely, true); - } + public void PerformSafelyWithSharing() => RunTest(DomainUpgradeMode.PerformSafely, true); [Test] - public void ValidateWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Validate, false); - } + public void ValidateWithoutSharingTest() => RunTest(DomainUpgradeMode.Validate, false); [Test] - public void ValidateWithSharingTest() - { - RunTest(DomainUpgradeMode.Validate, true); - } + public void ValidateWithSharingTest() => RunTest(DomainUpgradeMode.Validate, true); [Test] - public void SkipWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Skip, false); - } + public void SkipWithoutSharingTest() => RunTest(DomainUpgradeMode.Skip, false); [Test] - public void SkipWithSharingTest() - { - RunTest(DomainUpgradeMode.Skip, true); - } + public void SkipWithSharingTest() => RunTest(DomainUpgradeMode.Skip, true); [Test] - public void LegacyValidateWithoutSharingTest() - { - RunTest(DomainUpgradeMode.LegacyValidate, false); - } + public void LegacyValidateWithoutSharingTest() => RunTest(DomainUpgradeMode.LegacyValidate, false); [Test] - public void LegacyValidateWithSharingTest() - { - RunTest(DomainUpgradeMode.LegacyValidate, true); - } + public void LegacyValidateWithSharingTest() => RunTest(DomainUpgradeMode.LegacyValidate, true); [Test] - public void LegacySkipWithoutSharingTest() - { - RunTest(DomainUpgradeMode.LegacySkip, false); - } + public void LegacySkipWithoutSharingTest() => RunTest(DomainUpgradeMode.LegacySkip, false); [Test] - public void LegacySkipWithSharingTest() - { - RunTest(DomainUpgradeMode.LegacySkip, true); - } + public void LegacySkipWithSharingTest() => RunTest(DomainUpgradeMode.LegacySkip, true); + #endregion private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverNodes) @@ -119,8 +84,9 @@ private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverN ValidateModifiedCatalogs(catalog); PopulateIgnoredData(catalog); - using (var domain = BuildDomain(upgradeMode, shareStorageSchemaOverNodes)) + using (var domain = BuildDomain(upgradeMode, shareStorageSchemaOverNodes)) { ValidateDomainData(domain); + } catalog = ExtractCatalog(); ValidateModifiedCatalogs(catalog); @@ -133,14 +99,14 @@ private Domain BuildInitialDomain() { var configuration = base.BuildConfiguration(); configuration.UpgradeMode = DomainUpgradeMode.Recreate; - configuration.Types.Register(typeof (Product).Assembly, typeof (Product).Namespace); + configuration.Types.Register(typeof(Product).Assembly, typeof(Product).Namespace); if (nodeToSchemaMap.Count > 0) { configuration.DefaultSchema = nodeToSchemaMap[MainNodeId]; var nodeConfiguration = new NodeConfiguration(AdditionalNodeId); nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; nodeConfiguration.SchemaMapping.Add(configuration.DefaultSchema, nodeToSchemaMap[AdditionalNodeId]); var domain = BuildDomain(configuration); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); return domain; } return BuildDomain(configuration); @@ -152,7 +118,7 @@ private Domain BuildDomain(DomainUpgradeMode upgradeMode, bool shareStorageSchem configuration.UpgradeMode = upgradeMode; configuration.IgnoreRules = GetIgnoreRules(); configuration.ShareStorageSchemaOverNodes = shareStorageSchemaOverNodes; - configuration.Types.Register(typeof (Product).Assembly, typeof (Product).Namespace); + configuration.Types.Register(typeof(Product).Assembly, typeof(Product).Namespace); if (nodeToSchemaMap.Count > 0) { configuration.DefaultSchema = nodeToSchemaMap[MainNodeId]; @@ -160,7 +126,7 @@ private Domain BuildDomain(DomainUpgradeMode upgradeMode, bool shareStorageSchem nodeConfiguration.UpgradeMode = upgradeMode; nodeConfiguration.SchemaMapping.Add(nodeToSchemaMap[MainNodeId], nodeToSchemaMap[AdditionalNodeId]); var domain = BuildDomain(configuration); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); return domain; } return BuildDomain(configuration); @@ -170,26 +136,25 @@ private void PopulateData(Domain domain) { var storageNodes = (nodeToSchemaMap.Count > 0) ? nodeToSchemaMap.Keys.ToList() - : new List() {MainNodeId}; + : new List() { MainNodeId }; foreach (var storageNode in storageNodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(storageNode); - using (var transaction = session.OpenTransaction()) { - var euro = new Currency() {Name = "Euro", ShortName = "EU"}; - var dollar = new Currency() {Name = "Dollar", ShortName = "USD"}; - var ruble = new Currency() {Name = "Ruble", ShortName = "RUB"}; - - var product1 = new Product() {Name = "Product 1"}; - var product2 = new Product() {Name = "Product 2"}; - var product3 = new Product() {Name = "Product 3"}; - - var priceList1 = new PriceList() {CreatedOn = DateTime.Now, IsArchived = false}; - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product1, Price = 1500}); - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product2, Price = 15000}); - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product3, Price = 150000}); - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(storageNode); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var euro = new Currency() { Name = "Euro", ShortName = "EU" }; + var dollar = new Currency() { Name = "Dollar", ShortName = "USD" }; + var ruble = new Currency() { Name = "Ruble", ShortName = "RUB" }; + + var product1 = new Product() { Name = "Product 1" }; + var product2 = new Product() { Name = "Product 2" }; + var product3 = new Product() { Name = "Product 3" }; + + var priceList1 = new PriceList() { CreatedOn = DateTime.Now, IsArchived = false }; + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product1, Price = 1500 }); + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product2, Price = 15000 }); + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product3, Price = 150000 }); + transaction.Complete(); } } } @@ -198,29 +163,28 @@ private void ValidateDomainData(Domain domain) { var storageNodes = (nodeToSchemaMap.Count > 0) ? nodeToSchemaMap.Keys.ToList() - : new List() {MainNodeId}; + : new List() { MainNodeId }; foreach (var storageNode in storageNodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(storageNode); - using (var transaction = session.OpenTransaction()) { - var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); - Assert.That(currencies.Length, Is.EqualTo(3)); - Assert.That(currencies[0].Name, Is.EqualTo("Dollar")); - Assert.That(currencies[1].Name, Is.EqualTo("Euro")); - Assert.That(currencies[2].Name, Is.EqualTo("Ruble")); - - var products = session.Query.All().OrderBy(c => c.Name).ToArray(); - Assert.That(products.Length, Is.EqualTo(3)); - Assert.That(products[0].Name, Is.EqualTo("Product 1")); - Assert.That(products[1].Name, Is.EqualTo("Product 2")); - Assert.That(products[2].Name, Is.EqualTo("Product 3")); - - var priceList = session.Query.All().Single(); - Assert.That(priceList.IsArchived, Is.False); - Assert.That(priceList.Items.Count(), Is.EqualTo(3)); - Assert.That(priceList.Items.All(i => i.Currency==currencies[2]), Is.True); - } + var selectedNode = domain.SelectStorageNode(storageNode); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); + Assert.That(currencies.Length, Is.EqualTo(3)); + Assert.That(currencies[0].Name, Is.EqualTo("Dollar")); + Assert.That(currencies[1].Name, Is.EqualTo("Euro")); + Assert.That(currencies[2].Name, Is.EqualTo("Ruble")); + + var products = session.Query.All().OrderBy(c => c.Name).ToArray(); + Assert.That(products.Length, Is.EqualTo(3)); + Assert.That(products[0].Name, Is.EqualTo("Product 1")); + Assert.That(products[1].Name, Is.EqualTo("Product 2")); + Assert.That(products[2].Name, Is.EqualTo("Product 3")); + + var priceList = session.Query.All().Single(); + Assert.That(priceList.IsArchived, Is.False); + Assert.That(priceList.Items.Count(), Is.EqualTo(3)); + Assert.That(priceList.Items.All(i => i.Currency == currencies[2]), Is.True); } } } @@ -236,8 +200,9 @@ private void ValidateInitialCatalog(Catalog catalog) validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[MainNodeId]]); validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[AdditionalNodeId]]); } - else + else { validatableSchemas.Add(catalog.DefaultSchema); + } foreach (var schema in validatableSchemas) { var productTable = schema.Tables["Product"]; @@ -276,8 +241,9 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[MainNodeId]]); validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[AdditionalNodeId]]); } - else + else { validatableSchemas.Add(catalog.DefaultSchema); + } foreach (var schema in validatableSchemas) { using (var connection = driver.CreateConnection()) { @@ -286,23 +252,29 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) var productTable = schema.Tables["Product"]; var hiddenNameColumn = productTable.CreateColumn("HiddenName", GetTypeForString(255)); hiddenNameColumn.IsNullable = true; - using (var command = connection.CreateCommand(driver.Compile(SqlDdl.Alter(productTable, SqlDdl.AddColumn(hiddenNameColumn))).GetCommandText())) - command.ExecuteNonQuery(); + var commandText = driver.Compile(SqlDdl.Alter(productTable, SqlDdl.AddColumn(hiddenNameColumn))).GetCommandText(); + using (var command = connection.CreateCommand(commandText)) { + _ = command.ExecuteNonQuery(); + } var priceListTable = schema.Tables["PriceList"]; var hiddenCommentColumn = priceListTable.CreateColumn("HiddenComment", GetTypeForString(255)); hiddenCommentColumn.IsNullable = true; - using (var command = connection.CreateCommand(driver.Compile(SqlDdl.Alter(priceListTable, SqlDdl.AddColumn(hiddenCommentColumn))).GetCommandText())) - command.ExecuteNonQuery(); + commandText = driver.Compile(SqlDdl.Alter(priceListTable, SqlDdl.AddColumn(hiddenCommentColumn))).GetCommandText(); + using (var command = connection.CreateCommand(commandText)) { + _ = command.ExecuteNonQuery(); + } var currencyTable = schema.Tables["Currency"]; var prefixColumnTemplate = "NotInDomain{0}"; - var columns = new[] {"Column1", "Column2", "Column3"}; + var columns = new[] { "Column1", "Column2", "Column3" }; foreach (var column in columns) { var prefixColumn = currencyTable.CreateColumn(string.Format(prefixColumnTemplate, column), GetTypeForString(255)); prefixColumn.IsNullable = true; - using (var command = connection.CreateCommand(driver.Compile(SqlDdl.Alter(currencyTable, SqlDdl.AddColumn(prefixColumn))).GetCommandText())) - command.ExecuteNonQuery(); + commandText = driver.Compile(SqlDdl.Alter(currencyTable, SqlDdl.AddColumn(prefixColumn))).GetCommandText(); + using (var command = connection.CreateCommand(commandText)) { + _ = command.ExecuteNonQuery(); + } } var ignoredTable = schema.CreateTable("HiddenTable"); @@ -312,8 +284,9 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) name.IsNullable = false; var pk = ignoredTable.CreatePrimaryKey("PK_HiddenTable", idColumn); - using (var command = connection.CreateCommand(SqlDdl.Create(ignoredTable))) - command.ExecuteNonQuery(); + using (var command = connection.CreateCommand(SqlDdl.Create(ignoredTable))) { + _ = command.ExecuteNonQuery(); + } var notInDomainTable1 = schema.CreateTable("NotInDomain1"); idColumn = notInDomainTable1.CreateColumn("Id", new SqlValueType(SqlType.Int64)); @@ -322,8 +295,9 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) name.IsNullable = false; pk = notInDomainTable1.CreatePrimaryKey("PK_NotInDomain1", idColumn); - using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable1))) - command.ExecuteNonQuery(); + using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable1))) { + _ = command.ExecuteNonQuery(); + } var notInDomainTable2 = schema.CreateTable("NotInDomain2"); idColumn = notInDomainTable2.CreateColumn("Id", new SqlValueType(SqlType.Int64)); @@ -332,8 +306,9 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) name.IsNullable = false; pk = notInDomainTable2.CreatePrimaryKey("PK_NotInDomain2", idColumn); - using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable2))) - command.ExecuteNonQuery(); + using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable2))) { + _ = command.ExecuteNonQuery(); + } var notInDomainTable3 = schema.CreateTable("NotInDomain3"); idColumn = notInDomainTable3.CreateColumn("Id", new SqlValueType(SqlType.Int64)); @@ -342,8 +317,9 @@ private void ManuallyInsertIgnoredItems(Catalog catalog) name.IsNullable = false; pk = notInDomainTable3.CreatePrimaryKey("PK_NotInDomain3", idColumn); - using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable3))) - command.ExecuteNonQuery(); + using (var command = connection.CreateCommand(SqlDdl.Create(notInDomainTable3))) { + _ = command.ExecuteNonQuery(); + } } } } @@ -355,8 +331,9 @@ private void PopulateIgnoredData(Catalog catalog) validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[MainNodeId]]); validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[AdditionalNodeId]]); } - else + else { validatableSchemas.Add(catalog.DefaultSchema); + } foreach (var schema in validatableSchemas) { using (var connecton = driver.CreateConnection()) { @@ -366,15 +343,17 @@ private void PopulateIgnoredData(Catalog catalog) var @ref = SqlDml.TableRef(productTable); var update = SqlDml.Update(@ref); update.Values.Add(@ref["HiddenName"], SqlDml.Literal("Hidden name")); - using (var command = connecton.CreateCommand(update)) - command.ExecuteNonQuery(); + using (var command = connecton.CreateCommand(update)) { + _ = command.ExecuteNonQuery(); + } var priceListTable = schema.Tables["PriceList"]; @ref = SqlDml.TableRef(priceListTable); update = SqlDml.Update(@ref); update.Values.Add(@ref["HiddenComment"], SqlDml.Literal("Some hidden comment")); - using (var command = connecton.CreateCommand(update)) - command.ExecuteNonQuery(); + using (var command = connecton.CreateCommand(update)) { + _ = command.ExecuteNonQuery(); + } var currencyTable = schema.Tables["Currency"]; @ref = SqlDml.TableRef(currencyTable); @@ -382,8 +361,9 @@ private void PopulateIgnoredData(Catalog catalog) update.Values.Add(@ref["NotInDomainColumn1"], SqlDml.Literal("Not in domain")); update.Values.Add(@ref["NotInDomainColumn2"], SqlDml.Literal("Not in domain")); update.Values.Add(@ref["NotInDomainColumn3"], SqlDml.Literal("Not in domain")); - using (var command = connecton.CreateCommand(update)) - command.ExecuteNonQuery(); + using (var command = connecton.CreateCommand(update)) { + _ = command.ExecuteNonQuery(); + } } } } @@ -395,8 +375,9 @@ private void ValidateModifiedCatalogs(Catalog catalog) validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[MainNodeId]]); validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[AdditionalNodeId]]); } - else + else { validatableSchemas.Add(catalog.DefaultSchema); + } foreach (var schema in validatableSchemas) { var productTable = schema.Tables["Product"]; @@ -460,8 +441,9 @@ private void ValidateIgnoredData(Catalog catalog) validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[MainNodeId]]); validatableSchemas.Add(catalog.Schemas[nodeToSchemaMap[AdditionalNodeId]]); } - else + else { validatableSchemas.Add(catalog.DefaultSchema); + } foreach (var schema in validatableSchemas) { using (var connection = driver.CreateConnection()) { @@ -524,34 +506,32 @@ private void ValidateIgnoredData(Catalog catalog) private IgnoreRuleCollection GetIgnoreRules() { var collection = new IgnoreRuleCollection(); - collection.IgnoreTable("HiddenTable"); - collection.IgnoreTable("NotInDomain*"); - collection.IgnoreColumn("NotInDomain*").WhenTable("Currency"); - collection.IgnoreColumn("HiddenComment").WhenTable("PriceList"); - collection.IgnoreColumn("HiddenName").WhenTable("Product"); + _ = collection.IgnoreTable("HiddenTable"); + _ = collection.IgnoreTable("NotInDomain*"); + _ = collection.IgnoreColumn("NotInDomain*").WhenTable("Currency"); + _ = collection.IgnoreColumn("HiddenComment").WhenTable("PriceList"); + _ = collection.IgnoreColumn("HiddenName").WhenTable("Product"); return collection; } - private SqlValueType GetTypeForString(int? length) - { - return driver.TypeMappings.Mappings[typeof (string)].MapType(length, null, null); - } + private SqlValueType GetTypeForString(int? length) => + driver.TypeMappings.Mappings[typeof(string)].MapType(length, null, null); private Dictionary BuildNodeToSchemaMap() { - if (ProviderInfo.Supports(ProviderFeatures.Multischema)) - return new Dictionary {{MainNodeId, "Model1"}, {AdditionalNodeId, "Model2"}}; - return new Dictionary(); + return ProviderInfo.Supports(ProviderFeatures.Multischema) + ? new Dictionary {{MainNodeId, "Model1"}, {AdditionalNodeId, "Model2"}} + : new Dictionary(); } private Catalog ExtractCatalog() { using (var connection = driver.CreateConnection()) { connection.Open(); - if (nodeToSchemaMap.Count > 0) - return driver.ExtractCatalog(connection); - return driver.ExtractDefaultSchema(connection).Catalog; + return nodeToSchemaMap.Count > 0 + ? driver.ExtractCatalog(connection) + : driver.ExtractDefaultSchema(connection).Catalog; } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/MetadataUpdate/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/MetadataUpdate/SimpleTest.cs index 98471749ba..e70e94b150 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/MetadataUpdate/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/MetadataUpdate/SimpleTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.04.03 @@ -52,8 +52,9 @@ protected void BuildInitialDomain() ApplyCustomSettingsToInitialConfiguration(emptyDomainConfiguration); using (var domain = Domain.Build(emptyDomainConfiguration)) { - foreach (var nodeConfiguration in GetNodes(DomainUpgradeMode.Recreate).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in GetNodes(DomainUpgradeMode.Recreate).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } } } @@ -65,38 +66,39 @@ protected void BuildTestDomain(DomainUpgradeMode upgradeMode) domainConfiguration.ShareStorageSchemaOverNodes = true; using (var domain = Domain.Build(domainConfiguration)) { - foreach (var nodeConfiguration in GetNodes(upgradeMode).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in GetNodes(upgradeMode).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } } } protected virtual void ApplyCustomSettingsToInitialConfiguration(DomainConfiguration domainConfiguration) { - domainConfiguration.Types.Register(typeof (model.Part1.TestEntity1)); - domainConfiguration.Types.Register(typeof (model.Part2.TestEntity2)); - domainConfiguration.Types.Register(typeof (model.Part3.TestEntity3)); - domainConfiguration.Types.Register(typeof (model.Part4.TestEntity4)); + domainConfiguration.Types.Register(typeof(model.Part1.TestEntity1)); + domainConfiguration.Types.Register(typeof(model.Part2.TestEntity2)); + domainConfiguration.Types.Register(typeof(model.Part3.TestEntity3)); + domainConfiguration.Types.Register(typeof(model.Part4.TestEntity4)); } protected virtual void ApplyCustomSettingsToTestConfiguration(DomainConfiguration domainConfiguration) { - domainConfiguration.Types.Register(typeof (model.CustomUpgradeHandler)); - - domainConfiguration.Types.Register(typeof (model.Part1.TestEntity1)); - domainConfiguration.Types.Register(typeof (model.Part1.RecycledTestEntity1)); - domainConfiguration.Types.Register(typeof (model.Part1.NewTestEntity1)); - - domainConfiguration.Types.Register(typeof (model.Part2.TestEntity2)); - domainConfiguration.Types.Register(typeof (model.Part2.RecycledTestEntity2)); - domainConfiguration.Types.Register(typeof (model.Part2.NewTestEntity2)); - - domainConfiguration.Types.Register(typeof (model.Part3.TestEntity3)); - domainConfiguration.Types.Register(typeof (model.Part3.RecycledTestEntity3)); - domainConfiguration.Types.Register(typeof (model.Part3.NewTestEntity3)); - - domainConfiguration.Types.Register(typeof (model.Part4.TestEntity4)); - domainConfiguration.Types.Register(typeof (model.Part4.RecycledTestEntity4)); - domainConfiguration.Types.Register(typeof (model.Part4.NewTestEntity4)); + domainConfiguration.Types.Register(typeof(model.CustomUpgradeHandler)); + + domainConfiguration.Types.Register(typeof(model.Part1.TestEntity1)); + domainConfiguration.Types.Register(typeof(model.Part1.RecycledTestEntity1)); + domainConfiguration.Types.Register(typeof(model.Part1.NewTestEntity1)); + + domainConfiguration.Types.Register(typeof(model.Part2.TestEntity2)); + domainConfiguration.Types.Register(typeof(model.Part2.RecycledTestEntity2)); + domainConfiguration.Types.Register(typeof(model.Part2.NewTestEntity2)); + + domainConfiguration.Types.Register(typeof(model.Part3.TestEntity3)); + domainConfiguration.Types.Register(typeof(model.Part3.RecycledTestEntity3)); + domainConfiguration.Types.Register(typeof(model.Part3.NewTestEntity3)); + + domainConfiguration.Types.Register(typeof(model.Part4.TestEntity4)); + domainConfiguration.Types.Register(typeof(model.Part4.RecycledTestEntity4)); + domainConfiguration.Types.Register(typeof(model.Part4.NewTestEntity4)); } protected virtual IEnumerable GetNodes(DomainUpgradeMode upgradeMode) diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs index 742b06d21e..da68a69f57 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.03.30 @@ -15,15 +15,9 @@ namespace Xtensive.Orm.Tests.Upgrade.SchemaSharing.QueryBuilder public class SimpleTest { [OneTimeSetUp] - public void TestFixtureSetup() - { - CheckRequirements(); - } + public void TestFixtureSetup() => CheckRequirements(); - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } + protected virtual void CheckRequirements() => Require.ProviderIs(StorageProvider.SqlServer); [Test] public void PerformSafelyTest() @@ -70,18 +64,15 @@ public void LegacyValidateTest() protected virtual DomainConfiguration GetDomainConfiguration() { var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (model.Part1.TestEntity1)); - configuration.Types.Register(typeof (model.Part2.TestEntity2)); - configuration.Types.Register(typeof (model.Part3.TestEntity3)); - configuration.Types.Register(typeof (model.Part4.TestEntity4)); - var aaa = configuration.Sessions.Default; + configuration.Types.Register(typeof(model.Part1.TestEntity1)); + configuration.Types.Register(typeof(model.Part2.TestEntity2)); + configuration.Types.Register(typeof(model.Part3.TestEntity3)); + configuration.Types.Register(typeof(model.Part4.TestEntity4)); return configuration; } - protected virtual List GetNodes(DomainUpgradeMode upgradeMode) - { - return new List {new NodeConfiguration(WellKnown.DefaultNodeId) {UpgradeMode = upgradeMode}}; - } + protected virtual List GetNodes(DomainUpgradeMode upgradeMode) => + new List { new NodeConfiguration(WellKnown.DefaultNodeId) { UpgradeMode = upgradeMode } }; private void BuildInitialDomain() { @@ -90,21 +81,21 @@ private void BuildInitialDomain() using (var domain = Domain.Build(configuration)) { var nodes = GetNodes(DomainUpgradeMode.Recreate); - foreach (var nodeConfiguration in nodes.Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in nodes.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } foreach (var nodeConfiguration in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeConfiguration.NodeId); - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - new model.Part1.TestEntity1 {Text = session.StorageNodeId}; - new model.Part2.TestEntity2 {Text = session.StorageNodeId}; - new model.Part3.TestEntity3 {Text = session.StorageNodeId}; - new model.Part4.TestEntity4 {Text = session.StorageNodeId}; - - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(nodeConfiguration.NodeId); + using (var session = selectedNode.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + _ = new model.Part1.TestEntity1 { Text = session.StorageNodeId }; + _ = new model.Part2.TestEntity2 { Text = session.StorageNodeId }; + _ = new model.Part3.TestEntity3 { Text = session.StorageNodeId }; + _ = new model.Part4.TestEntity4 { Text = session.StorageNodeId }; + + transaction.Complete(); } } } @@ -113,19 +104,21 @@ private void BuildInitialDomain() private void BuildTestDomain(DomainUpgradeMode upgradeMode) { var configuration = GetDomainConfiguration(); - configuration.Types.Register(typeof (model.CustomUpgradeHandler)); - if (upgradeMode==DomainUpgradeMode.Perform || upgradeMode==DomainUpgradeMode.PerformSafely) { - configuration.Types.Register(typeof (model.Part1.NewTestEntity1)); - configuration.Types.Register(typeof (model.Part2.NewTestEntity2)); - configuration.Types.Register(typeof (model.Part3.NewTestEntity3)); - configuration.Types.Register(typeof (model.Part4.NewTestEntity4)); + configuration.Types.Register(typeof(model.CustomUpgradeHandler)); + if (upgradeMode == DomainUpgradeMode.Perform || upgradeMode == DomainUpgradeMode.PerformSafely) { + configuration.Types.Register(typeof(model.Part1.NewTestEntity1)); + configuration.Types.Register(typeof(model.Part2.NewTestEntity2)); + configuration.Types.Register(typeof(model.Part3.NewTestEntity3)); + configuration.Types.Register(typeof(model.Part4.NewTestEntity4)); } configuration.UpgradeMode = upgradeMode; configuration.ShareStorageSchemaOverNodes = true; using (var domain = Domain.Build(configuration)) { - foreach (var nodeConfiguration in GetNodes(upgradeMode).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + var nodes = GetNodes(upgradeMode).Where(n => n.NodeId != WellKnown.DefaultNodeId); + foreach (var nodeConfiguration in nodes) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs index 3699bc0c61..ce1308fc55 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.03.29 @@ -15,56 +15,32 @@ namespace Xtensive.Orm.Tests.Upgrade.SchemaSharing.Requests public class SimpleTest { [OneTimeSetUp] - public void TestFixtureSetUp() - { - CheckRequirements(); - } + public void TestFixtureSetUp() => CheckRequirements(); protected virtual void CheckRequirements() { } [Test] - public void Recreate() - { - RunTest(DomainUpgradeMode.Recreate); - } + public void Recreate() => RunTest(DomainUpgradeMode.Recreate); [Test] - public void Skip() - { - RunTest(DomainUpgradeMode.Skip); - } + public void Skip() => RunTest(DomainUpgradeMode.Skip); [Test] - public void Validate() - { - RunTest(DomainUpgradeMode.Validate); - } + public void Validate() => RunTest(DomainUpgradeMode.Validate); [Test] - public void Perform() - { - RunTest(DomainUpgradeMode.Perform); - } + public void Perform() => RunTest(DomainUpgradeMode.Perform); [Test] - public void PerformSafely() - { - RunTest(DomainUpgradeMode.PerformSafely); - } + public void PerformSafely() => RunTest(DomainUpgradeMode.PerformSafely); [Test] - public void LegacySkip() - { - RunTest(DomainUpgradeMode.LegacySkip); - } + public void LegacySkip() => RunTest(DomainUpgradeMode.LegacySkip); [Test] - public void LegacyValidate() - { - RunTest(DomainUpgradeMode.LegacyValidate); - } + public void LegacyValidate() => RunTest(DomainUpgradeMode.LegacyValidate); public void RunTest(DomainUpgradeMode upgradeMode) { @@ -79,20 +55,20 @@ protected void BuildInitialDomain() using (var domain = Domain.Build(configuration)) { var nodes = GetNodes(DomainUpgradeMode.Recreate); - foreach (var nodeConfiguration in nodes.Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in nodes.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } foreach (var nodeConfiguration in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeConfiguration.NodeId); - using (session.Activate()) - using (var transaction = session.OpenTransaction()) { - new model.Part1.TestEntity1 {Text = session.StorageNodeId}; - new model.Part2.TestEntity2 {Text = session.StorageNodeId}; - new model.Part3.TestEntity3 {Text = session.StorageNodeId}; - new model.Part4.TestEntity4 {Text = session.StorageNodeId}; - transaction.Complete(); - } + var selecteNode = domain.SelectStorageNode(nodeConfiguration.NodeId); + using (var session = selecteNode.OpenSession()) + using (session.Activate()) + using (var transaction = session.OpenTransaction()) { + _ = new model.Part1.TestEntity1 { Text = session.StorageNodeId }; + _ = new model.Part2.TestEntity2 { Text = session.StorageNodeId }; + _ = new model.Part3.TestEntity3 { Text = session.StorageNodeId }; + _ = new model.Part4.TestEntity4 { Text = session.StorageNodeId }; + transaction.Complete(); } } } @@ -101,31 +77,29 @@ protected void BuildInitialDomain() protected void BuildTestDomain(DomainUpgradeMode upgradeMode) { var configuration = GetDomainConfiguration(); - configuration.Types.Register(typeof (model.CustomUpgradeHandler)); + configuration.Types.Register(typeof(model.CustomUpgradeHandler)); configuration.UpgradeMode = upgradeMode; configuration.ShareStorageSchemaOverNodes = true; using (var domain = Domain.Build(configuration)) { - var nodes = GetNodes(upgradeMode); - - foreach (var nodeConfiguration in nodes.Where(n=>n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + var nodes = GetNodes(upgradeMode).Where(n => n.NodeId != WellKnown.DefaultNodeId); + foreach (var nodeConfiguration in nodes) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } } } protected virtual DomainConfiguration GetDomainConfiguration() { var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (model.Part1.TestEntity1)); - configuration.Types.Register(typeof (model.Part2.TestEntity2)); - configuration.Types.Register(typeof (model.Part3.TestEntity3)); - configuration.Types.Register(typeof (model.Part4.TestEntity4)); + configuration.Types.Register(typeof(model.Part1.TestEntity1)); + configuration.Types.Register(typeof(model.Part2.TestEntity2)); + configuration.Types.Register(typeof(model.Part3.TestEntity3)); + configuration.Types.Register(typeof(model.Part4.TestEntity4)); return configuration; } - protected virtual List GetNodes(DomainUpgradeMode upgradeMode) - { - return new List {new NodeConfiguration(WellKnown.DefaultNodeId)}; - } + protected virtual List GetNodes(DomainUpgradeMode upgradeMode) => + new List { new NodeConfiguration(WellKnown.DefaultNodeId) }; } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs index 703c1cdfe8..399a2150ac 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.03.28 @@ -16,15 +16,9 @@ namespace Xtensive.Orm.Tests.Upgrade.SchemaSharing.SqlExecutor public class SimpleTest { [OneTimeSetUp] - public void TestFixtureSetup() - { - CheckRequirements(); - } + public void TestFixtureSetup() => CheckRequirements(); - protected virtual void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } + protected virtual void CheckRequirements() => Require.ProviderIs(StorageProvider.SqlServer); [Test] public void PerformSafelyTest() @@ -71,17 +65,15 @@ public void LegacyValidateTest() protected virtual DomainConfiguration GetDomainConfiguration() { var configuration = DomainConfigurationFactory.Create(); - configuration.Types.Register(typeof (model.Part1.TestEntity1)); - configuration.Types.Register(typeof (model.Part2.TestEntity2)); - configuration.Types.Register(typeof (model.Part3.TestEntity3)); - configuration.Types.Register(typeof (model.Part4.TestEntity4)); + configuration.Types.Register(typeof(model.Part1.TestEntity1)); + configuration.Types.Register(typeof(model.Part2.TestEntity2)); + configuration.Types.Register(typeof(model.Part3.TestEntity3)); + configuration.Types.Register(typeof(model.Part4.TestEntity4)); return configuration; } - protected virtual List GetNodes(DomainUpgradeMode upgradeMode) - { - return new List() {new NodeConfiguration(WellKnown.DefaultNodeId) {UpgradeMode = upgradeMode}}; - } + protected virtual List GetNodes(DomainUpgradeMode upgradeMode) => + new List() { new NodeConfiguration(WellKnown.DefaultNodeId) { UpgradeMode = upgradeMode } }; private void BuildInitialDomain() { @@ -90,18 +82,19 @@ private void BuildInitialDomain() using (var domain = Domain.Build(configuration)) { var nodes = GetNodes(DomainUpgradeMode.Recreate); - foreach (var nodeConfiguration in nodes.Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in nodes.Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } foreach (var nodeConfiguration in nodes) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeConfiguration.NodeId); + var selectedNode = domain.SelectStorageNode(nodeConfiguration.NodeId); + using (var session = selectedNode.OpenSession()) { using (session.Activate()) using (var transaction = session.OpenTransaction()) { - new model.Part1.TestEntity1 {Text = session.StorageNodeId}; - new model.Part2.TestEntity2 {Text = session.StorageNodeId}; - new model.Part3.TestEntity3 {Text = session.StorageNodeId}; - new model.Part4.TestEntity4 {Text = session.StorageNodeId}; + _ = new model.Part1.TestEntity1 { Text = session.StorageNodeId }; + _ = new model.Part2.TestEntity2 { Text = session.StorageNodeId }; + _ = new model.Part3.TestEntity3 { Text = session.StorageNodeId }; + _ = new model.Part4.TestEntity4 { Text = session.StorageNodeId }; transaction.Complete(); } @@ -113,18 +106,19 @@ private void BuildInitialDomain() private void BuildTestDomain(DomainUpgradeMode upgradeMode) { var configuration = GetDomainConfiguration(); - configuration.Types.Register(typeof (model.CustomUpgradeHandler)); - if (upgradeMode==DomainUpgradeMode.Perform || upgradeMode==DomainUpgradeMode.PerformSafely) { - configuration.Types.Register(typeof (model.Part1.NewTestEntity1)); - configuration.Types.Register(typeof (model.Part2.NewTestEntity2)); - configuration.Types.Register(typeof (model.Part3.NewTestEntity3)); - configuration.Types.Register(typeof (model.Part4.NewTestEntity4)); + configuration.Types.Register(typeof(model.CustomUpgradeHandler)); + if (upgradeMode == DomainUpgradeMode.Perform || upgradeMode == DomainUpgradeMode.PerformSafely) { + configuration.Types.Register(typeof(model.Part1.NewTestEntity1)); + configuration.Types.Register(typeof(model.Part2.NewTestEntity2)); + configuration.Types.Register(typeof(model.Part3.NewTestEntity3)); + configuration.Types.Register(typeof(model.Part4.NewTestEntity4)); } configuration.UpgradeMode = upgradeMode; configuration.ShareStorageSchemaOverNodes = true; using (var domain = Domain.Build(configuration)) { - foreach (var nodeConfiguration in GetNodes(upgradeMode).Where(n => n.NodeId!=WellKnown.DefaultNodeId)) - domain.StorageNodeManager.AddNode(nodeConfiguration); + foreach (var nodeConfiguration in GetNodes(upgradeMode).Where(n => n.NodeId != WellKnown.DefaultNodeId)) { + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + } } } } diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs index 82667e92a8..05d47aa293 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2017 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2017-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alexey Kulakov // Created: 2017.03.03 @@ -17,7 +17,7 @@ namespace Xtensive.Orm.Tests.Upgrade.SchemaSharing { public class StorageSchemaCapturer { - private Dictionary mappings = new Dictionary(); + private readonly Dictionary mappings = new Dictionary(); public void Register(UpgradeStage stage, ModelMapping mapping) { @@ -26,16 +26,12 @@ public void Register(UpgradeStage stage, ModelMapping mapping) public ModelMapping GetMappingForStage(UpgradeStage stage) { - ModelMapping mapping; - if (!mappings.TryGetValue(stage, out mapping)) - throw new Exception(string.Format("There is no model mappings for the {0} stage ", stage)); - return mapping; + return !mappings.TryGetValue(stage, out var mapping) + ? throw new Exception(string.Format("There is no model mappings for the {0} stage ", stage)) + : mapping; } - public void Reset() - { - mappings.Clear(); - } + public void Reset() => mappings.Clear(); } // Captures model mappings of both upgrading and final nodes for one build whether domain or node @@ -44,18 +40,17 @@ public class Upgrader : UpgradeHandler private ModelMapping upgadingStageMapping; private ModelMapping finalStageMapping; - public override bool CanUpgradeFrom(string oldVersion) - { - return true; - } + public override bool CanUpgradeFrom(string oldVersion) => true; public override void OnStage() { var stage = UpgradeContext.Stage; - if (stage==UpgradeStage.Final) + if (stage == UpgradeStage.Final) { finalStageMapping = Session.Current.StorageNode.Mapping; - else + } + else { upgadingStageMapping = Session.Current.StorageNode.Mapping; + } } public override void OnComplete(Domain domain) @@ -86,117 +81,62 @@ public override void TestFixtureSetUp() } [Test] - public void RecreateTestWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Recreate, false); - } + public void RecreateTestWithoutSharingTest() => RunTest(DomainUpgradeMode.Recreate, false); [Test] - public void RecreateTestWithSharingTest() - { - RunTest(DomainUpgradeMode.Recreate, true); - } + public void RecreateTestWithSharingTest() => RunTest(DomainUpgradeMode.Recreate, true); [Test] - public void PerformSafelyWithoutChangesWithoutSharingTest() - { - RunTest(DomainUpgradeMode.PerformSafely, false, false); - } + public void PerformSafelyWithoutChangesWithoutSharingTest() => RunTest(DomainUpgradeMode.PerformSafely, false, false); [Test] - public void PerformSafelyWithoutChangesWithSharingTest() - { - RunTest(DomainUpgradeMode.PerformSafely, true, false); - - } + public void PerformSafelyWithoutChangesWithSharingTest() => RunTest(DomainUpgradeMode.PerformSafely, true, false); [Test] - public void PerformSafelyWithChangesWithoutSharing() - { - RunTest(DomainUpgradeMode.PerformSafely, false, true); - } + public void PerformSafelyWithChangesWithoutSharing() => RunTest(DomainUpgradeMode.PerformSafely, false, true); [Test] - public void PerformSafelyWithChangesWithSharing() - { - RunTest(DomainUpgradeMode.PerformSafely, true, true); - } + public void PerformSafelyWithChangesWithSharing() => RunTest(DomainUpgradeMode.PerformSafely, true, true); [Test] - public void PerformWithoutChangesWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Perform, false, false); - } + public void PerformWithoutChangesWithoutSharingTest() => RunTest(DomainUpgradeMode.Perform, false, false); [Test] - public void PerformWithoutChangesWithSharingTest() - { - RunTest(DomainUpgradeMode.Perform, true, false); - } + public void PerformWithoutChangesWithSharingTest() => RunTest(DomainUpgradeMode.Perform, true, false); [Test] - public void PerformWithChangesWithSharingTest() - { - RunTest(DomainUpgradeMode.Perform, true, true); - } + public void PerformWithChangesWithSharingTest() => RunTest(DomainUpgradeMode.Perform, true, true); [Test] - public void PerformWithChangesWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Perform, false, true); - } + public void PerformWithChangesWithoutSharingTest() => RunTest(DomainUpgradeMode.Perform, false, true); [Test] - public void ValidateWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Validate, false); - } + public void ValidateWithoutSharingTest() => RunTest(DomainUpgradeMode.Validate, false); [Test] - public void ValidateWithSharingTest() - { - RunTest(DomainUpgradeMode.Validate, true); - } + public void ValidateWithSharingTest() => RunTest(DomainUpgradeMode.Validate, true); [Test] - public void SkipWithoutSharingTest() - { - RunTest(DomainUpgradeMode.Skip, false); - } + public void SkipWithoutSharingTest() => RunTest(DomainUpgradeMode.Skip, false); [Test] - public void SkipWithSharingTest() - { - RunTest(DomainUpgradeMode.Skip, true); - } + public void SkipWithSharingTest() => RunTest(DomainUpgradeMode.Skip, true); [Test] - public void LegacySkipWithountSharingTest() - { - RunTest(DomainUpgradeMode.LegacySkip, false); - } + public void LegacySkipWithountSharingTest() => RunTest(DomainUpgradeMode.LegacySkip, false); [Test] - public void LegacySkipWithSharingTest() - { - RunTest(DomainUpgradeMode.LegacySkip, true); - } + public void LegacySkipWithSharingTest() => RunTest(DomainUpgradeMode.LegacySkip, true); [Test] - public void LegacyValidateWithoutSharingTest() - { - RunTest(DomainUpgradeMode.LegacyValidate, false); - } + public void LegacyValidateWithoutSharingTest() => RunTest(DomainUpgradeMode.LegacyValidate, false); [Test] - public void LegacyValidateWithSharingTest() - { - RunTest(DomainUpgradeMode.LegacyValidate, true); - } + public void LegacyValidateWithSharingTest() => RunTest(DomainUpgradeMode.LegacyValidate, true); private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverNodes, bool withModelChanges = false) { - if (upgradeMode==DomainUpgradeMode.Recreate) { + if (upgradeMode == DomainUpgradeMode.Recreate) { RunRecreateTest(shareStorageSchemaOverNodes); return; } @@ -204,8 +144,9 @@ private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverN var isMultinode = nodeToSchemaMap.Count > 0; var configuration = BuildConfiguration(); configuration.UpgradeMode = DomainUpgradeMode.Recreate; - if (isMultinode) + if (isMultinode) { configuration.DefaultSchema = nodeToSchemaMap[MainNodeId]; + } using (var initialDomain = BuildDomain(configuration)) { PopulateData(initialDomain, MainNodeId); @@ -213,7 +154,7 @@ private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverN var nodeConfiguration = new NodeConfiguration(AdditionalNodeId); nodeConfiguration.SchemaMapping.Add(nodeToSchemaMap[MainNodeId], nodeToSchemaMap[AdditionalNodeId]); nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; - initialDomain.StorageNodeManager.AddNode(nodeConfiguration); + _ = initialDomain.StorageNodeManager.AddNode(nodeConfiguration); PopulateData(initialDomain, AdditionalNodeId); } } @@ -221,11 +162,13 @@ private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverN configuration = BuildConfiguration(); configuration.UpgradeMode = upgradeMode; configuration.ShareStorageSchemaOverNodes = shareStorageSchemaOverNodes; - configuration.Types.Register(typeof (Upgrader)); - if ((upgradeMode==DomainUpgradeMode.Perform || upgradeMode==DomainUpgradeMode.PerformSafely) && withModelChanges) - configuration.Types.Register(typeof (TypeForUgrade)); // that gives us schema cache reset - if (isMultinode) + configuration.Types.Register(typeof(Upgrader)); + if ((upgradeMode == DomainUpgradeMode.Perform || upgradeMode == DomainUpgradeMode.PerformSafely) && withModelChanges) { + configuration.Types.Register(typeof(TypeForUgrade)); // that gives us schema cache reset + } + if (isMultinode) { configuration.DefaultSchema = nodeToSchemaMap[MainNodeId]; + } using (var domain = BuildDomain(configuration)) { ValidateMappings(domain, false); @@ -235,7 +178,7 @@ private void RunTest(DomainUpgradeMode upgradeMode, bool shareStorageSchemaOverN var nodeConfiguration = new NodeConfiguration(AdditionalNodeId); nodeConfiguration.UpgradeMode = upgradeMode; nodeConfiguration.SchemaMapping.Add(nodeToSchemaMap[MainNodeId], nodeToSchemaMap[AdditionalNodeId]); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); ValidateMappings(domain, true); ValidateData(domain, AdditionalNodeId); @@ -251,8 +194,9 @@ private void RunRecreateTest(bool shareStorageSchemaOverNodes) configuration.UpgradeMode = DomainUpgradeMode.Recreate; configuration.ShareStorageSchemaOverNodes = shareStorageSchemaOverNodes; configuration.Types.Register(typeof (Upgrader)); - if (isMultinode) + if (isMultinode) { configuration.DefaultSchema = nodeToSchemaMap[MainNodeId]; + } using (var domain = BuildDomain(configuration)) { ValidateMappings(domain, false); @@ -263,11 +207,13 @@ private void RunRecreateTest(bool shareStorageSchemaOverNodes) var nodeConfiguration = new NodeConfiguration(AdditionalNodeId); nodeConfiguration.UpgradeMode = DomainUpgradeMode.Recreate; nodeConfiguration.SchemaMapping.Add(nodeToSchemaMap[MainNodeId], nodeToSchemaMap[AdditionalNodeId]); - domain.StorageNodeManager.AddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); ValidateMappings(domain, true); - if (shareStorageSchemaOverNodes) + if (shareStorageSchemaOverNodes) { ValidateNodesShareSchema(domain); + } + PopulateData(domain, AdditionalNodeId); ValidateData(domain, AdditionalNodeId); } @@ -276,24 +222,23 @@ private void RunRecreateTest(bool shareStorageSchemaOverNodes) private void PopulateData(Domain domain, string nodeId) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var transaction = session.OpenTransaction()) { - var euro = new Currency() {Name = "Euro", ShortName = "EU"}; - var dollar = new Currency() {Name = "Dollar", ShortName = "USD"}; - var ruble = new Currency() {Name = "Ruble", ShortName = "RUB"}; - - var product1 = new Product() {Name = "Product 1"}; - var product2 = new Product() {Name = "Product 2"}; - var product3 = new Product() {Name = "Product 3"}; - - var priceList1 = new PriceList() {CreatedOn = DateTime.Now, IsArchived = false}; - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product1, Price = 1500}); - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product2, Price = 15000}); - priceList1.Items.Add(new PriceListItem() {Currency = ruble, Product = product3, Price = 150000}); - - transaction.Complete(); - } + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + using (var transaction = session.OpenTransaction()) { + var euro = new Currency() { Name = "Euro", ShortName = "EU" }; + var dollar = new Currency() { Name = "Dollar", ShortName = "USD" }; + var ruble = new Currency() { Name = "Ruble", ShortName = "RUB" }; + + var product1 = new Product() { Name = "Product 1" }; + var product2 = new Product() { Name = "Product 2" }; + var product3 = new Product() { Name = "Product 3" }; + + var priceList1 = new PriceList() { CreatedOn = DateTime.Now, IsArchived = false }; + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product1, Price = 1500 }); + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product2, Price = 15000 }); + _ = priceList1.Items.Add(new PriceListItem() { Currency = ruble, Product = product3, Price = 150000 }); + + transaction.Complete(); } } @@ -301,8 +246,9 @@ private void ValidateMappings(Domain domain, bool isAdditionalNode) { var capturer = domain.Extensions.Get(); ValidateFinalMappings(domain, capturer.GetMappingForStage(UpgradeStage.Final)); - if (domain.Configuration.UpgradeMode.IsMultistage()) + if (domain.Configuration.UpgradeMode.IsMultistage()) { ValidateUpgradingMapping(domain, capturer.GetMappingForStage(UpgradeStage.Upgrading), isAdditionalNode); + } } private void ValidateNodesShareSchema(Domain domain) @@ -317,26 +263,26 @@ private void ValidateNodesShareSchema(Domain domain) private void ValidateData(Domain domain, string nodeId) { - using (var session = domain.OpenSession()) { - session.SelectStorageNode(nodeId); - using (var transaction = session.OpenTransaction()) { - var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); - Assert.That(currencies.Length, Is.EqualTo(3)); - Assert.That(currencies[0].Name, Is.EqualTo("Dollar")); - Assert.That(currencies[1].Name, Is.EqualTo("Euro")); - Assert.That(currencies[2].Name, Is.EqualTo("Ruble")); - - var products = session.Query.All().OrderBy(c => c.Name).ToArray(); - Assert.That(products.Length, Is.EqualTo(3)); - Assert.That(products[0].Name, Is.EqualTo("Product 1")); - Assert.That(products[1].Name, Is.EqualTo("Product 2")); - Assert.That(products[2].Name, Is.EqualTo("Product 3")); - - var priceList = session.Query.All().Single(); - Assert.That(priceList.IsArchived, Is.False); - Assert.That(priceList.Items.Count(), Is.EqualTo(3)); - Assert.That(priceList.Items.All(i => i.Currency==currencies[2]), Is.True); - } + var selectedNode = domain.SelectStorageNode(nodeId); + using (var session = selectedNode.OpenSession()) + + using (var transaction = session.OpenTransaction()) { + var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); + Assert.That(currencies.Length, Is.EqualTo(3)); + Assert.That(currencies[0].Name, Is.EqualTo("Dollar")); + Assert.That(currencies[1].Name, Is.EqualTo("Euro")); + Assert.That(currencies[2].Name, Is.EqualTo("Ruble")); + + var products = session.Query.All().OrderBy(c => c.Name).ToArray(); + Assert.That(products.Length, Is.EqualTo(3)); + Assert.That(products[0].Name, Is.EqualTo("Product 1")); + Assert.That(products[1].Name, Is.EqualTo("Product 2")); + Assert.That(products[2].Name, Is.EqualTo("Product 3")); + + var priceList = session.Query.All().Single(); + Assert.That(priceList.IsArchived, Is.False); + Assert.That(priceList.Items.Count(), Is.EqualTo(3)); + Assert.That(priceList.Items.All(i => i.Currency == currencies[2]), Is.True); } } @@ -349,10 +295,10 @@ private void ValidateFinalMappings(Domain domain, ModelMapping mapping) Assert.DoesNotThrow(() => { var name = schemaNode.Name; }); Assert.DoesNotThrow(() => { var dbName = schemaNode.DbName; }); if (readingNamesDenied) { - Assert.Throws(() => { var schemaName = schemaNode.Schema.Name; }); - Assert.Throws(() => { var schemaDbName = schemaNode.Schema.DbName; }); - Assert.Throws(() => { var catalogName = schemaNode.Schema.Catalog.Name; }); - Assert.Throws(() => { var catalogDbName = schemaNode.Schema.Catalog.DbName; }); + _ = Assert.Throws(() => { var schemaName = schemaNode.Schema.Name; }); + _ = Assert.Throws(() => { var schemaDbName = schemaNode.Schema.DbName; }); + _ = Assert.Throws(() => { var catalogName = schemaNode.Schema.Catalog.Name; }); + _ = Assert.Throws(() => { var catalogDbName = schemaNode.Schema.Catalog.DbName; }); } else { Assert.DoesNotThrow(() => { var schemaName = schemaNode.Schema.Name; }); @@ -383,28 +329,28 @@ private void ValidateUpgradingMapping(Domain domain, ModelMapping mapping, bool Assert.DoesNotThrow(() => { var catalogDbName = schemaNode.Schema.Catalog.DbName; }); } else { - Assert.Throws(() => { var schemaName = schemaNode.Schema.Name; }); - Assert.Throws(() => { var schemaDbName = schemaNode.Schema.DbName; }); - Assert.Throws(() => { var catalogName = schemaNode.Schema.Catalog.Name; }); - Assert.Throws(() => { var catalogDbName = schemaNode.Schema.Catalog.DbName; }); + _ = Assert.Throws(() => { var schemaName = schemaNode.Schema.Name; }); + _ = Assert.Throws(() => { var schemaDbName = schemaNode.Schema.DbName; }); + _ = Assert.Throws(() => { var catalogName = schemaNode.Schema.Catalog.Name; }); + _ = Assert.Throws(() => { var catalogDbName = schemaNode.Schema.Catalog.DbName; }); } } } private Dictionary BuildNodeToSchemaMap() { - if (ProviderInfo.Supports(ProviderFeatures.Multischema)) - return new Dictionary {{MainNodeId, "Model1"}, {AdditionalNodeId, "Model2"}}; - return new Dictionary(); + return ProviderInfo.Supports(ProviderFeatures.Multischema) + ? new Dictionary {{MainNodeId, "Model1"}, {AdditionalNodeId, "Model2"}} + : new Dictionary(); } protected override DomainConfiguration BuildConfiguration() { var configuration = base.BuildConfiguration(); - configuration.Types.Register(typeof (Product)); - configuration.Types.Register(typeof (Currency)); - configuration.Types.Register(typeof (PriceList)); - configuration.Types.Register(typeof (PriceListItem)); + configuration.Types.Register(typeof(Product)); + configuration.Types.Register(typeof(Currency)); + configuration.Types.Register(typeof(PriceList)); + configuration.Types.Register(typeof(PriceListItem)); return configuration; } } From b459b99eb7bee6c45af8d0274e1ab039e3bbdc04 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Mon, 19 Oct 2020 13:43:28 +0500 Subject: [PATCH 09/17] Fixes spelling mistake --- Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs b/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs index 2e3ff5bfe9..4ac369a3a0 100644 --- a/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs +++ b/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs @@ -6,7 +6,7 @@ namespace Xtensive.Orm.Interfaces { /// - /// Defindes -dependant operations. + /// Defines -dependant operations. /// public interface ISelectedStorageNode { From be9dbc1e916ea7854855e855cd89bb09960b36bd Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Mon, 19 Oct 2020 19:45:34 +0500 Subject: [PATCH 10/17] Adds tests for connection info and init sql for nodes --- .../Multinode/ConnectionOverrideTest.cs | 134 +++++++++++++++ .../InitializationSqlOverrideTest.cs | 155 ++++++++++++++++++ 2 files changed, 289 insertions(+) create mode 100644 Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs create mode 100644 Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs new file mode 100644 index 0000000000..238f363a31 --- /dev/null +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs @@ -0,0 +1,134 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Tests.Storage.Multinode +{ + [TestFixture] + public class ConnectionOverrideTest + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + public TestEntity(Session session) + : base(session) + { + } + } + + [OneTimeSetUp] + public void OneTimeSetUp() => Require.ProviderIs(StorageProvider.SqlServer); + + [Test] + public void NullNodeConnectionTest() + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.Types.Register(typeof(TestEntity)); + domainConfig.DefaultSchema = "dbo"; + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + + var nodeConfig = new NodeConfiguration("Additional"); + nodeConfig.UpgradeMode = DomainUpgradeMode.Recreate; + nodeConfig.ConnectionInfo = null; + nodeConfig.SchemaMapping.Add("dbo", "Model1"); + + void commandValidator(object sender, DbCommandEventArgs args) + { + var session = ((SessionEventAccessor) sender).Session; + if (session.StorageNodeId == WellKnown.DefaultNodeId) { + Assert.That(args.Command.CommandText.Contains("[dbo].[ConnectionOverrideTest.TestEntity]"), Is.True); + } + else { + Assert.That(args.Command.CommandText.Contains("[Model1].[ConnectionOverrideTest.TestEntity]"), Is.True); + } + } + + using (var domain = Domain.Build(domainConfig)) { + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); + _ = new TestEntity(session); + session.Events.DbCommandExecuted += commandValidator; + session.SaveChanges(); + session.Events.DbCommandExecuted -= commandValidator; + } + + _ = domain.StorageNodeManager.AddNode(nodeConfig); + selectedNode = domain.SelectStorageNode("Additional"); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()){ + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); + + _ = new TestEntity(session); + session.Events.DbCommandExecuted += commandValidator; + session.SaveChanges(); + session.Events.DbCommandExecuted -= commandValidator; + } + } + } + + [Test] + public void OverwrittenConnectionTest() + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.Types.Register(typeof(TestEntity)); + domainConfig.DefaultSchema = "dbo"; + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + + var domainConnectionUrlString = domainConfig.ConnectionInfo.ConnectionUrl.ToString(); + var parametersPosition = domainConnectionUrlString.IndexOf('?'); + + var nodeConfig = new NodeConfiguration("Additional"); + nodeConfig.UpgradeMode = DomainUpgradeMode.Recreate; + nodeConfig.ConnectionInfo = new ConnectionInfo(UrlInfo.Parse(domainConnectionUrlString.Substring(0, parametersPosition))); + nodeConfig.SchemaMapping.Add("dbo", "Model1"); + + void commandValidator(object sender, DbCommandEventArgs args) + { + var session = ((SessionEventAccessor) sender).Session; + if (session.StorageNodeId == WellKnown.DefaultNodeId) { + Assert.That(args.Command.CommandText.Contains("[dbo].[ConnectionOverrideTest.TestEntity]"), Is.True); + } + else { + Assert.That(args.Command.CommandText.Contains("[Model1].[ConnectionOverrideTest.TestEntity]"), Is.True); + } + } + + using (var domain = Domain.Build(domainConfig)) { + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); + _ = new TestEntity(session); + session.Events.DbCommandExecuted += commandValidator; + session.SaveChanges(); + session.Events.DbCommandExecuted -= commandValidator; + } + + _ = domain.StorageNodeManager.AddNode(nodeConfig); + selectedNode = domain.SelectStorageNode("Additional"); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.Not.EqualTo(domainConfig.ConnectionInfo)); + + _ = new TestEntity(session); + session.Events.DbCommandExecuted += commandValidator; + session.SaveChanges(); + session.Events.DbCommandExecuted -= commandValidator; + } + } + } + } +} diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs new file mode 100644 index 0000000000..e925c20c46 --- /dev/null +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; +using Xtensive.Orm.Services; + +namespace Xtensive.Orm.Tests.Storage.Multinode +{ + [TestFixture] + public sealed class InitializationSqlOverrideTest + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; set; } + + public TestEntity(Session session) + : base(session) + { + } + } + + [OneTimeSetUp] + public void OneTimeSetUp() => Require.ProviderIs(StorageProvider.SqlServer); + + [Test] + public void NullNodeInitSql() + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.Types.Register(typeof(TestEntity)); + domainConfig.DefaultSchema = "dbo"; + domainConfig.ConnectionInitializationSql = "USE [DO-Tests]"; + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + + var nodeConfig = new NodeConfiguration("Additional"); + nodeConfig.UpgradeMode = DomainUpgradeMode.Recreate; + nodeConfig.ConnectionInitializationSql = null; + nodeConfig.SchemaMapping.Add("dbo", "Model1"); + + using (var domain = Domain.Build(domainConfig)) { + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests")); + } + } + + _ = domain.StorageNodeManager.AddNode(nodeConfig); + selectedNode = domain.SelectStorageNode("Additional"); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests")); + } + } + } + } + + [Test] + public void EmptyStringIninSql() + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.Types.Register(typeof(TestEntity)); + domainConfig.DefaultSchema = "dbo"; + domainConfig.ConnectionInitializationSql = "USE [DO-Tests]"; + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + + var nodeConfig = new NodeConfiguration("Additional"); + nodeConfig.UpgradeMode = DomainUpgradeMode.Recreate; + nodeConfig.ConnectionInitializationSql = string.Empty; + nodeConfig.SchemaMapping.Add("dbo", "Model1"); + + using (var domain = Domain.Build(domainConfig)) { + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); + _ = new TestEntity(session); + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests")); + } + } + + _ = domain.StorageNodeManager.AddNode(nodeConfig); + selectedNode = domain.SelectStorageNode("Additional"); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests")); + } + } + } + } + + [Test] + public void ValidInitSql() + { + var domainConfig = DomainConfigurationFactory.Create(); + domainConfig.Types.Register(typeof(TestEntity)); + domainConfig.DefaultSchema = "dbo"; + domainConfig.ConnectionInitializationSql = "USE [DO-Tests]"; + domainConfig.UpgradeMode = DomainUpgradeMode.Recreate; + + var nodeConfig = new NodeConfiguration("Additional"); + nodeConfig.UpgradeMode = DomainUpgradeMode.Recreate; + nodeConfig.ConnectionInitializationSql = "USE [DO-Tests-1]"; + nodeConfig.SchemaMapping.Add("dbo", "dbo"); + + using (var domain = Domain.Build(domainConfig)) { + var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var connection = ((SqlSessionHandler) session.Handler).Connection; + Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); + _ = new TestEntity(session); + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests")); + } + } + + _ = domain.StorageNodeManager.AddNode(nodeConfig); + selectedNode = domain.SelectStorageNode("Additional"); + using (var session = selectedNode.OpenSession()) + using (var tx = session.OpenTransaction()) { + var service = session.Services.Get(); + using (var command = service.CreateCommand()) { + command.CommandText = "SELECT DB_NAME() AS [Current Database];"; + var databaseName = command.ExecuteScalar(); + Assert.That(databaseName, Is.EqualTo("DO-Tests-1")); + } + } + } + } + } +} From cf53ce97174fda167eae9048545cf529c6ed7ea8 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Wed, 21 Oct 2020 21:18:53 +0500 Subject: [PATCH 11/17] StorageNode and Domain become ISessionSource-es --- Orm/Xtensive.Orm/Orm/Domain.cs | 59 ++------------ ...lectedStorageNode.cs => ISessionSource.cs} | 42 +--------- .../Orm/Internals/SelectedStorageNode.cs | 76 ------------------- Orm/Xtensive.Orm/Orm/StorageNode.cs | 71 +++++++++++++++-- Orm/Xtensive.Orm/Orm/StorageNodeManager.cs | 27 ++++++- .../Orm/Upgrade/UpgradingDomainBuilder.cs | 7 +- 6 files changed, 104 insertions(+), 178 deletions(-) rename Orm/Xtensive.Orm/Orm/Interfaces/{ISelectedStorageNode.cs => ISessionSource.cs} (57%) delete mode 100644 Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index b4a2ac4d69..31dc1326a8 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -35,7 +35,7 @@ namespace Xtensive.Orm /// /// [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)] - public sealed class Domain : IDisposable, IHasExtensions + public sealed class Domain : IDisposable, IHasExtensions, ISessionSource { private readonly object disposeGuard = new object(); private readonly object singleConnectionGuard = new object(); @@ -116,13 +116,13 @@ public static Domain Demand() /// } /// /// with given identifier does not exist. - public ISelectedStorageNode SelectStorageNode([NotNull]string storageNodeId) + public ISessionSource SelectStorageNode([NotNull]string storageNodeId) { var node = StorageNodeManager.GetNode(storageNodeId); if (node == null) { throw new ArgumentException(string.Format(Strings.ExStorageNodeWithIdXIsNotFound, storageNodeId)); } - return new SelectedStorageNode(this, node); + return node; } #region Private / internal members @@ -284,22 +284,6 @@ internal Session OpenSessionInternal(SessionConfiguration configuration, Storage return session; } - /// - /// Opens new with default asynchronously. - /// - /// A task representing the asynchronous operation. - /// - /// using (var session = await Domain.OpenSessionAsync()) { - /// // work with persistent objects here. - /// } - /// - /// - public Task OpenSessionAsync() - { - var configuration = Configuration.Sessions.Default; - return OpenSessionAsync(configuration, CancellationToken.None); - } - /// /// Opens new with default asynchronously. /// @@ -312,27 +296,12 @@ public Task OpenSessionAsync() /// } /// /// - public Task OpenSessionAsync(CancellationToken cancellationToken) + public Task OpenSessionAsync(CancellationToken cancellationToken = default) { var configuration = Configuration.Sessions.Default; return OpenSessionAsync(configuration, cancellationToken); } - /// - /// Opens new of specified asynchronously. - /// - /// The type of session. - /// A task representing the asynchronous operation. - /// - /// using (var session = await domain.OpenSessionAsync(sessionType)) { - /// // work with persistent objects here. - /// } - /// - public Task OpenSessionAsync(SessionType type) - { - return OpenSessionAsync(type, CancellationToken.None); - } - /// /// Opens new of specified asynchronously. /// @@ -345,7 +314,7 @@ public Task OpenSessionAsync(SessionType type) /// // work with persistent objects here. /// } /// - public Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken) + public Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default) { cancellationToken.ThrowIfCancellationRequested(); switch (type) { @@ -362,22 +331,6 @@ public Task OpenSessionAsync(SessionType type, CancellationToken cancel } } - /// - /// Opens new with specified asynchronously. - /// - /// The session configuration. - /// A task representing the asynchronous operation. - /// - /// using (var session = await domain.OpenSessionAsync(configuration)) { - /// // work with persistent objects here - /// } - /// - /// - public Task OpenSessionAsync(SessionConfiguration configuration) - { - return OpenSessionAsync(configuration, CancellationToken.None); - } - /// /// Opens new with specified asynchronously. /// @@ -391,7 +344,7 @@ public Task OpenSessionAsync(SessionConfiguration configuration) /// } /// /// - public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken) + public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default) { return OpenSessionInternalAsync(configuration, null, configuration.Supports(SessionOptions.AutoActivation), cancellationToken); diff --git a/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs b/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs similarity index 57% rename from Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs rename to Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs index 4ac369a3a0..328215a88a 100644 --- a/Orm/Xtensive.Orm/Orm/Interfaces/ISelectedStorageNode.cs +++ b/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs @@ -6,9 +6,9 @@ namespace Xtensive.Orm.Interfaces { /// - /// Defines -dependant operations. + /// Contract for types being able to open . /// - public interface ISelectedStorageNode + public interface ISessionSource { /// /// Opens new with default . @@ -16,12 +16,6 @@ public interface ISelectedStorageNode /// /// New object. /// - /// - /// using (var session = domain.SelectStorageNode(nodeId).OpenSession()) { - /// // work with persistent objects here. - /// } - /// - /// Session OpenSession(); /// @@ -31,11 +25,6 @@ public interface ISelectedStorageNode /// /// New object. /// - /// - /// using (var session = domain.SelectStorageNode(nodeId).OpenSession(sessionType)) { - /// // work with persistent objects here. - /// } - /// Session OpenSession(SessionType type); /// @@ -45,38 +34,20 @@ public interface ISelectedStorageNode /// /// New object. /// - /// - /// using (var session = domain.SelectStorageNode(nodeId).OpenSession(configuration)) { - /// // work with persistent objects here - /// } - /// - /// Session OpenSession(SessionConfiguration configuration); /// /// Asynchronously opens new with default . /// /// A task representing the asynchronous operation. - /// - /// /// var ctSource = new CancellationTokenSource(); - /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(ctSource.Token)) { - /// // work with persistent objects here. - /// } - /// - /// Task OpenSessionAsync(CancellationToken cancellationToken = default); /// /// Asynchronously opens new of specified asynchronously. /// /// The type of session. + /// The token to monitor for cancellation requests. /// A task representing the asynchronous operation. - /// - /// var ctSource = new CancellationTokenSource(); - /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(sessionType, ctSource.Token)) { - /// // work with persistent objects here. - /// } - /// Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default); /// @@ -85,13 +56,6 @@ public interface ISelectedStorageNode /// The session configuration. /// The token to monitor for cancellation requests. /// A task representing the asynchronous operation. - /// - /// var ctSource = new CancellationTokenSource(); - /// using (var session = await domain.SelectStorageNode(nodeId).OpenSessionAsync(configuration, ctSource.Token)) { - /// // work with persistent objects here - /// } - /// - /// Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default); } } diff --git a/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs b/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs deleted file mode 100644 index 71a7e37baa..0000000000 --- a/Orm/Xtensive.Orm/Orm/Internals/SelectedStorageNode.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Xtensive.Core; -using Xtensive.Orm; -using Xtensive.Orm.Configuration; -using Xtensive.Orm.Interfaces; - -namespace Xtensive.Orm.Internals -{ - internal sealed class SelectedStorageNode : ISelectedStorageNode - { - private readonly Domain domain; - private readonly StorageNode storageNode; - - /// - public Session OpenSession() - { - return OpenSession(domain.Configuration.Sessions.Default); - } - - /// - public Session OpenSession(SessionType type) - { - return type switch { - SessionType.User => OpenSession(domain.Configuration.Sessions.Default), - SessionType.System => OpenSession(domain.Configuration.Sessions.System), - SessionType.KeyGenerator => OpenSession(domain.Configuration.Sessions.KeyGenerator), - SessionType.Service => OpenSession(domain.Configuration.Sessions.Service), - _ => throw new ArgumentOutOfRangeException("type"), - }; - } - - /// - public Session OpenSession(SessionConfiguration configuration) - { - ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); - return domain.OpenSessionInternal(configuration, storageNode, configuration.Supports(SessionOptions.AutoActivation)); - } - - /// - public Task OpenSessionAsync(CancellationToken cancellationToken = default) => - OpenSessionAsync(domain.Configuration.Sessions.Default, cancellationToken); - - /// - public Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default) - { - return type switch { - SessionType.User => OpenSessionAsync(domain.Configuration.Sessions.Default), - SessionType.System => OpenSessionAsync(domain.Configuration.Sessions.System), - SessionType.KeyGenerator => OpenSessionAsync(domain.Configuration.Sessions.KeyGenerator), - SessionType.Service => OpenSessionAsync(domain.Configuration.Sessions.Service), - _ => throw new ArgumentOutOfRangeException("type"), - }; - } - - /// - public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default) - { - ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); - - return domain.OpenSessionInternalAsync(configuration, - storageNode, - configuration.Supports(SessionOptions.AllowSwitching), - cancellationToken); - } - - public SelectedStorageNode(Domain domain, StorageNode storageNode) - { - this.domain = domain; - this.storageNode = storageNode; - } - } -} diff --git a/Orm/Xtensive.Orm/Orm/StorageNode.cs b/Orm/Xtensive.Orm/Orm/StorageNode.cs index 3b631d0e04..56760cc5ce 100644 --- a/Orm/Xtensive.Orm/Orm/StorageNode.cs +++ b/Orm/Xtensive.Orm/Orm/StorageNode.cs @@ -1,13 +1,17 @@ -// Copyright (C) 2014 Xtensive LLC. +// Copyright (C) 2014 Xtensive LLC. // All rights reserved. // For conditions of distribution and use, see license. // Created by: Denis Krjuchkov // Created: 2014.03.13 +using System; using System.Collections.Concurrent; using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; using Xtensive.Core; using Xtensive.Orm.Configuration; +using Xtensive.Orm.Interfaces; using Xtensive.Orm.Model; using Xtensive.Orm.Providers; @@ -16,8 +20,10 @@ namespace Xtensive.Orm /// /// Storage node. /// - public sealed class StorageNode + public sealed class StorageNode : ISessionSource { + private readonly Domain domain; + /// /// Gets node identifier. /// @@ -44,15 +50,68 @@ public sealed class StorageNode internal ConcurrentDictionary> PersistRequestCache { get; private set; } + /// + public Session OpenSession() + { + return OpenSession(domain.Configuration.Sessions.Default); + } + + /// + public Session OpenSession(SessionType type) + { + return type switch { + SessionType.User => OpenSession(domain.Configuration.Sessions.Default), + SessionType.System => OpenSession(domain.Configuration.Sessions.System), + SessionType.KeyGenerator => OpenSession(domain.Configuration.Sessions.KeyGenerator), + SessionType.Service => OpenSession(domain.Configuration.Sessions.Service), + _ => throw new ArgumentOutOfRangeException("type"), + }; + } + + /// + public Session OpenSession(SessionConfiguration configuration) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + return domain.OpenSessionInternal(configuration, this, configuration.Supports(SessionOptions.AutoActivation)); + } + + /// + public Task OpenSessionAsync(CancellationToken cancellationToken = default) => + OpenSessionAsync(domain.Configuration.Sessions.Default, cancellationToken); + + /// + public Task OpenSessionAsync(SessionType type, CancellationToken cancellationToken = default) + { + return type switch { + SessionType.User => OpenSessionAsync(domain.Configuration.Sessions.Default), + SessionType.System => OpenSessionAsync(domain.Configuration.Sessions.System), + SessionType.KeyGenerator => OpenSessionAsync(domain.Configuration.Sessions.KeyGenerator), + SessionType.Service => OpenSessionAsync(domain.Configuration.Sessions.Service), + _ => throw new ArgumentOutOfRangeException("type"), + }; + } + + /// + public Task OpenSessionAsync(SessionConfiguration configuration, CancellationToken cancellationToken = default) + { + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + + return domain.OpenSessionInternalAsync(configuration, + this, + configuration.Supports(SessionOptions.AllowSwitching), + cancellationToken); + } // Constructors - internal StorageNode(NodeConfiguration configuration, ModelMapping mapping, TypeIdRegistry typeIdRegistry) + internal StorageNode(Domain domain, NodeConfiguration configuration, ModelMapping mapping, TypeIdRegistry typeIdRegistry) { - ArgumentValidator.EnsureArgumentNotNull(configuration, "configuration"); - ArgumentValidator.EnsureArgumentNotNull(mapping, "mapping"); - ArgumentValidator.EnsureArgumentNotNull(typeIdRegistry, "typeIdRegistry"); + ArgumentValidator.EnsureArgumentNotNull(domain, nameof(domain)); + ArgumentValidator.EnsureArgumentNotNull(configuration, nameof(configuration)); + ArgumentValidator.EnsureArgumentNotNull(mapping, nameof(mapping)); + ArgumentValidator.EnsureArgumentNotNull(typeIdRegistry, nameof(typeIdRegistry)); + this.domain = domain; Configuration = configuration; Mapping = mapping; TypeIdRegistry = typeIdRegistry; diff --git a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs index 8b2dbbd81a..85a73cffb8 100644 --- a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs +++ b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs @@ -1,9 +1,10 @@ -// Copyright (C) 2014 Xtensive LLC. +// Copyright (C) 2014 Xtensive LLC. // All rights reserved. // For conditions of distribution and use, see license. // Created by: Denis Krjuchkov // Created: 2014.03.13 +using System; using JetBrains.Annotations; using Xtensive.Orm.Configuration; using Xtensive.Orm.Providers; @@ -51,6 +52,30 @@ public StorageNode GetNode([NotNull] string nodeId) return handlers.StorageNodeRegistry.TryGet(nodeId); } + /// + /// Gets node with .NodeId if it exists, otherwise, + /// adds node with the specified and performs required upgrade actions + /// and return added node. + /// + /// Node configuration. + /// Given configurations has no specified. + /// New node cannot be registered. + [NotNull] + public StorageNode GetOrAddNode([NotNull] NodeConfiguration configuration) + { + if (string.IsNullOrEmpty(configuration.NodeId)) { + throw new InvalidOperationException(Strings.ExInvalidNodeIdentifier); + } + var node = GetNode(configuration.NodeId); + if (node != null) { + return node; + } + node = UpgradingDomainBuilder.BuildNode(handlers.Domain, configuration); + return handlers.StorageNodeRegistry.Add(node) + ? node + : throw new InvalidOperationException("Node was build but couldn't be registered."); + } + // Constructors diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs index 83299a9cbf..457cc07001 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs @@ -328,12 +328,13 @@ private StorageNode BuildStorageNode(Domain domain, SchemaExtractor extractor) var modelMapping = ModelMappingBuilder.Build( domain.Handlers, schemaExtractionResult, context.Services.MappingResolver, context.NodeConfiguration, context.UpgradeMode.IsLegacy()); - var result = new StorageNode(context.NodeConfiguration, modelMapping, new TypeIdRegistry()); + var result = new StorageNode(domain, context.NodeConfiguration, modelMapping, new TypeIdRegistry()); // Register default storage node immediately, // non-default nodes are registered in NodeManager after everything completes successfully. - if (result.Id==WellKnown.DefaultNodeId) - domain.Handlers.StorageNodeRegistry.Add(result); + if (result.Id==WellKnown.DefaultNodeId) { + _ = domain.Handlers.StorageNodeRegistry.Add(result); + } context.StorageNode = result; return result; From 52f3ab27b5515ab557679f29caedfab3657494e7 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 22 Oct 2020 20:33:41 +0500 Subject: [PATCH 12/17] Removes Domain.SelectStorageNode and its usage --- .../MultipleNodesTest.cs | 20 ++++++++--------- ...eMappingCachingInMaterializationContext.cs | 18 +++++---------- ...0647_StoredDomainModelMappingsUpdateBug.cs | 2 +- .../Multinode/ConnectionOverrideTest.cs | 12 ++++------ .../Storage/Multinode/DynamicTypeIdTest.cs | 16 ++++++-------- .../InitializationSqlOverrideTest.cs | 18 +++++---------- .../ObsoleteSelectStorageNodeTest.cs | 7 +++--- .../Storage/Multinode/QueryCachingTest.cs | 8 +++---- .../Multinode/StandardMultinodeTest.cs | 22 +++++++++---------- .../SimpleEntityManipulationTest.cs | 4 ++-- .../SchemaSharing/KeyGenerator/SimpleTest.cs | 4 ++-- .../HugeModelUpgrade/DatabasePerNodeTest.cs | 4 ++-- .../HugeModelUpgrade/MappedTypesNodesTest.cs | 4 ++-- .../HugeModelUpgrade/SchemaPerNodeTest.cs | 4 ++-- .../TwoDatabasesPerNodeTest.cs | 4 ++-- .../HugeModelUpgrade/TwoSchemasPerNodeTest.cs | 4 ++-- .../Upgrade/NewSkip/SingleDatabaseNodeTest.cs | 4 ++-- .../NewSkip/SingleSchemaNodeBuildingTest.cs | 4 ++-- .../Upgrade/SchemaSharing/IgnoreRulesTest.cs | 4 ++-- .../SchemaSharing/QueryBuilder/SimpleTest.cs | 2 +- .../SchemaSharing/Requests/SimpleTest.cs | 4 ++-- .../SchemaSharing/SqlExecutor/SimpleTest.cs | 2 +- .../SchemaSharing/StorageNodeBuildingTest.cs | 5 ++--- Orm/Xtensive.Orm/Orm/Domain.cs | 20 ----------------- Orm/Xtensive.Orm/Orm/Session.cs | 2 +- 25 files changed, 78 insertions(+), 120 deletions(-) diff --git a/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs b/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs index aa9f61a0af..94848d3175 100644 --- a/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs +++ b/Extensions/Xtensive.Orm.Localization.Tests/MultipleNodesTest.cs @@ -60,7 +60,7 @@ protected override DomainConfiguration BuildConfiguration() [Test] public void Node1Test01() { - var selectedNode = Domain.SelectStorageNode(WellKnown.DefaultNodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -76,7 +76,7 @@ public void Node1Test01() [Test] public void Node1Test02() { - var selectedNode = Domain.SelectStorageNode(WellKnown.DefaultNodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(WellKnown.DefaultNodeId); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -95,7 +95,7 @@ public void Node1Test02() [Test] public void Node2Test01() { - var selectedNode = Domain.SelectStorageNode(Node1Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node1Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -111,7 +111,7 @@ public void Node2Test01() [Test] public void Node2Test02() { - var selectedNode = Domain.SelectStorageNode(Node1Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node1Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -130,7 +130,7 @@ public void Node2Test02() [Test] public void Node3Test01() { - var selectedNode = Domain.SelectStorageNode(Node2Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node2Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -146,7 +146,7 @@ public void Node3Test01() [Test] public void Node3Test02() { - var selectedNode = Domain.SelectStorageNode(Node2Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node2Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -165,7 +165,7 @@ public void Node3Test02() [Test] public void Node4Test01() { - var selectedNode = Domain.SelectStorageNode(Node3Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node3Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -181,7 +181,7 @@ public void Node4Test01() [Test] public void Node4Test02() { - var selectedNode = Domain.SelectStorageNode(Node3Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node3Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -200,7 +200,7 @@ public void Node4Test02() [Test] public void Node5Test01() { - var selectedNode = Domain.SelectStorageNode(Node4Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node4Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); @@ -216,7 +216,7 @@ public void Node5Test01() [Test] public void Node5Test02() { - var selectedNode = Domain.SelectStorageNode(Node4Id); + var selectedNode = Domain.StorageNodeManager.GetNode(Node4Id); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var welcomePage = new Page(session); diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs index 31790caf47..dbf337f241 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0614_TypeMappingCachingInMaterializationContext.cs @@ -266,10 +266,8 @@ public void Test01() var multinodeDomainConfiguration = CreateConfiguration(typeof(Target.TimesheetCode), DomainUpgradeMode.Skip, "Model1"); var nodeConfiguration = CreateNodeConfiguration(Node2Name, "Model1", "Model2", DomainUpgradeMode.Skip); - using (var domain = BuildDomain(multinodeDomainConfiguration)) { - _ = domain.StorageNodeManager.AddNode(nodeConfiguration); - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) { + using (var domain = BuildDomain(multinodeDomainConfiguration, nodeConfiguration)) { + using (var session = domain.OpenSession()) { using (var transaction = session.OpenTransaction()) { var list = session.Query.All() .Where(c => c.Active) @@ -295,7 +293,7 @@ public void Test01() } } - selectedNode = domain.SelectStorageNode(Node2Name); + var selectedNode = domain.StorageNodeManager.GetNode(Node2Name); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var list = session.Query.All() @@ -381,8 +379,7 @@ public void Test02() var nodeConfiguration = CreateNodeConfiguration(Node1Name, "Model2", "Model1", DomainUpgradeMode.PerformSafely); using (var domain = BuildDomain(multinodeDomainConfiguration, nodeConfiguration)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) { + using (var session = domain.OpenSession()) { using (var transaction = session.OpenTransaction()) { var list = session.Query.All() .Where(c => c.Active) @@ -408,7 +405,7 @@ public void Test02() } } - selectedNode = domain.SelectStorageNode(Node1Name); + var selectedNode = domain.StorageNodeManager.GetNode(Node1Name); using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var list = session.Query.All() @@ -434,11 +431,6 @@ public void Test02() } } - private void CheckRequirements() - { - Require.ProviderIs(StorageProvider.SqlServer); - } - private Domain BuildDomain(DomainConfiguration configuration, NodeConfiguration nodeConfiguration = null) { try{ diff --git a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs index e39331183b..ececac6a07 100644 --- a/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs +++ b/Orm/Xtensive.Orm.Tests/Issues/IssueJira0647_StoredDomainModelMappingsUpdateBug.cs @@ -464,7 +464,7 @@ private void BuildBaseVersion() _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, alpha, DomainUpgradeMode.Recreate)); _ = domain.StorageNodeManager.AddNode(BuildNodeConfiguration(domain.Configuration, beta, DomainUpgradeMode.Recreate)); - var selectedNode = domain.SelectStorageNode(alpha.Name); + var selectedNode = domain.StorageNodeManager.GetNode(alpha.Name); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { _ = new ModelNamespace.HintTest.BaseVersion.Customer { Name = "CustomerName" }; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs index 238f363a31..1618dd8c2e 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs @@ -51,8 +51,7 @@ void commandValidator(object sender, DbCommandEventArgs args) } using (var domain = Domain.Build(domainConfig)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) + using (var session = domain.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); @@ -62,8 +61,7 @@ void commandValidator(object sender, DbCommandEventArgs args) session.Events.DbCommandExecuted -= commandValidator; } - _ = domain.StorageNodeManager.AddNode(nodeConfig); - selectedNode = domain.SelectStorageNode("Additional"); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()){ var connection = ((SqlSessionHandler) session.Handler).Connection; @@ -105,8 +103,7 @@ void commandValidator(object sender, DbCommandEventArgs args) } using (var domain = Domain.Build(domainConfig)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) + using (var session = domain.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); @@ -116,8 +113,7 @@ void commandValidator(object sender, DbCommandEventArgs args) session.Events.DbCommandExecuted -= commandValidator; } - _ = domain.StorageNodeManager.AddNode(nodeConfig); - selectedNode = domain.SelectStorageNode("Additional"); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs index b00e2ce28c..1108887679 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs @@ -335,17 +335,15 @@ public void TypeIdExtractionTest() using (domain) { var nodeConfiguration = new NodeConfiguration(AlternativeSchema) {UpgradeMode = DomainUpgradeMode.Validate}; nodeConfiguration.SchemaMapping.Add(DefaultSchema, AlternativeSchema); - _ = domain.StorageNodeManager.AddNode(nodeConfiguration); - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) { + using (var session = domain.OpenSession()) { var types = new[] { typeof(BaseEntity), typeof(Entity1), typeof(Entity2) }; foreach (var type in types) { Assert.That(session.StorageNode.TypeIdRegistry[domain.Model.Types[type]], Is.EqualTo(defaultSchemaMap[type])); } } - selectedNode = domain.SelectStorageNode(AlternativeSchema); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfiguration); using (var session = selectedNode.OpenSession()) { var types = new[] { typeof(BaseEntity), typeof(Entity1), typeof(Entity2) }; foreach (var type in types) { @@ -363,7 +361,7 @@ private void MainTestBody(Domain domain, string nodeId) var stringValue = "entity1 " + nodeId; var intValue = stringValue.Length; - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var baseEntity = new BaseEntity {Name = baseName}; @@ -372,7 +370,7 @@ private void MainTestBody(Domain domain, string nodeId) tx.Complete(); } - selectedNode = domain.SelectStorageNode(nodeId); + selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var baseTypeId = GetTypeId(session, typeof(BaseEntity)); @@ -400,7 +398,7 @@ private void MainTestBody(Domain domain, string nodeId) private void NonAbstractTypesTestBody(Domain domain, string nodeId) { - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { var query1 = session.Query.All(); @@ -441,7 +439,7 @@ private void NonAbstractTypesTestBody(Domain domain, string nodeId) private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) { - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { var query1 = session.Query.All(); @@ -483,7 +481,7 @@ private void AbstractClassDescendantsTestBody(Domain domain, string nodeId) private void InterfaceTestBody(Domain domain, string nodeId) { - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var trasaction = session.OpenTransaction()) { var firstImplementationsBaseQuery = session.Query.All(); diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs index e925c20c46..f6e643ac59 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs @@ -41,8 +41,7 @@ public void NullNodeInitSql() nodeConfig.SchemaMapping.Add("dbo", "Model1"); using (var domain = Domain.Build(domainConfig)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) + using (var session = domain.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); using (var command = service.CreateCommand()) { @@ -52,8 +51,7 @@ public void NullNodeInitSql() } } - _ = domain.StorageNodeManager.AddNode(nodeConfig); - selectedNode = domain.SelectStorageNode("Additional"); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); @@ -81,8 +79,7 @@ public void EmptyStringIninSql() nodeConfig.SchemaMapping.Add("dbo", "Model1"); using (var domain = Domain.Build(domainConfig)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) + using (var session = domain.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); @@ -95,8 +92,7 @@ public void EmptyStringIninSql() } } - _ = domain.StorageNodeManager.AddNode(nodeConfig); - selectedNode = domain.SelectStorageNode("Additional"); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); @@ -124,8 +120,7 @@ public void ValidInitSql() nodeConfig.SchemaMapping.Add("dbo", "dbo"); using (var domain = Domain.Build(domainConfig)) { - var selectedNode = domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var session = selectedNode.OpenSession()) + using (var session = domain.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; Assert.That(connection.ConnectionInfo, Is.EqualTo(domainConfig.ConnectionInfo)); @@ -138,8 +133,7 @@ public void ValidInitSql() } } - _ = domain.StorageNodeManager.AddNode(nodeConfig); - selectedNode = domain.SelectStorageNode("Additional"); + var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs index ddbd778404..6c0df1cea7 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs @@ -58,8 +58,7 @@ protected override Domain BuildDomain(DomainConfiguration configuration) protected override void PopulateData() { - var defaultNodeSelection = Domain.SelectStorageNode(WellKnown.DefaultNodeId); - using (var nodeSession = defaultNodeSelection.OpenSession()) + using (var nodeSession = Domain.OpenSession()) using (var tx = nodeSession.OpenTransaction()) { _ = new TestEntity(nodeSession) { NodeTag = DefaultNodeTag }; _ = new TestEntity(nodeSession) { NodeTag = DefaultNodeTag }; @@ -67,8 +66,8 @@ protected override void PopulateData() tx.Complete(); } - var additonalNodeSelection = Domain.SelectStorageNode(AdditionalNodeName); - using (var nodeSession = additonalNodeSelection.OpenSession()) + var additonalNode = Domain.StorageNodeManager.GetNode(AdditionalNodeName); + using (var nodeSession = additonalNode.OpenSession()) using (var tx = nodeSession.OpenTransaction()) { _ = new TestEntity(nodeSession) { NodeTag = AdditionalNodeTag }; _ = new TestEntity(nodeSession) { NodeTag = AdditionalNodeTag }; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs index 4e750f06b9..edd83ea992 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/QueryCachingTest.cs @@ -133,7 +133,7 @@ protected override void PopulateData() var nodes = new[] { WellKnown.DefaultNodeId, TestNodeId2, TestNodeId3 }; foreach(var nodeId in nodes) { - var selectedNode = Domain.SelectStorageNode(nodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { #region Entity creation @@ -246,7 +246,7 @@ public void TestNode3Test() private void RunTestSimpleQueryTest(string nodeId) { - var selectedNode = Domain.SelectStorageNode(nodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var expectedTypeId = GetExpectedTypeId(nodeId); @@ -297,7 +297,7 @@ private void RunTestSimpleQueryTest(string nodeId) private void RunFilterByTypeIdQueryTest(string nodeId) { - var selectedNode = Domain.SelectStorageNode(nodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var expectedTypeId = GetExpectedTypeId(nodeId); @@ -361,7 +361,7 @@ private void RunFilterByTypeIdQueryTest(string nodeId) private void RunFilterBySeveralTypeIdsTest(string nodeId) { - var selectedNode = Domain.SelectStorageNode(nodeId); + var selectedNode = Domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var expectedTypeId = GetExpectedTypeId(nodeId); diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs index efe6441d8d..acd9db1871 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StandardMultinodeTest.cs @@ -28,7 +28,7 @@ protected override DomainConfiguration BuildConfiguration() protected override void PopulateData() { - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var apple = new Apple(TestAppleTag); @@ -43,7 +43,7 @@ protected override void PopulateData() public void DoubleSelectNodeTest() { //Delete this test when obolete method will be removed - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) { #pragma warning disable CS0618 // Type or member is obsolete AssertEx.Throws(() => session.SelectStorageNode(TestNodeId3)); @@ -62,7 +62,7 @@ public void KeyNodeIdAssignTest() public void NodeIdLinq1Test() { // Entity fetched via LINQ - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.All().Single(a => a.Tag==TestAppleTag); @@ -74,7 +74,7 @@ public void NodeIdLinq1Test() public void NodeIdLinq2Test() { // Key fetched via LINQ - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.All().GroupBy(a => a.Key).Select(a => a.Key).Single(); @@ -86,7 +86,7 @@ public void NodeIdLinq2Test() public void NodeIdLinq3Test() { // Key fetched via LINQ - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.All().Select(r => r.Ref.Key).Single(); @@ -98,7 +98,7 @@ public void NodeIdLinq3Test() public void NodeIdLinq4Test() { // Key fetched via LINQ - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.All().GroupBy(a => a.Ref.Key).Select(a => a.Key).Single(); @@ -110,7 +110,7 @@ public void NodeIdLinq4Test() public void NodeIdPrefetch1Test() { // Entity fetched via fetch API (key object) - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.Single(testAppleKey); @@ -122,7 +122,7 @@ public void NodeIdPrefetch1Test() public void NodeIdPrefetch2Test() { // Entity fetched via fetch API (key values) - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.Single(TestAppleTag); @@ -134,7 +134,7 @@ public void NodeIdPrefetch2Test() public void NodeIdPrefetch3Test() { // Entity fetched via fetch API (multiple key values) - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var result = session.Query.Many(new[] {TestAppleTag}).ToList(); @@ -148,7 +148,7 @@ public void NodeIdPrefetch3Test() public void NodeIdReferenceFetchTest() { // Entity fetched via reference traversal - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var refObject = session.Query.Single(testFruitRefKey); @@ -161,7 +161,7 @@ public void NodeIdReferenceFetchTest() public void KeyNodeIdGenerateKeyTest() { // Custom generated key - var selectedNode = Domain.SelectStorageNode(TestNodeId2); + var selectedNode = Domain.StorageNodeManager.GetNode(TestNodeId2); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var generatedKey = Key.Generate(session); diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs index 6c7b1f8be5..2b2ffd2973 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/EntityManipulation/SimpleEntityManipulationTest.cs @@ -77,7 +77,7 @@ protected void RunTest(DomainUpgradeMode upgradeMode) } foreach (var storageNode in nodes) { - var selectedNode = domain.SelectStorageNode(storageNode.NodeId); + var selectedNode = domain.StorageNodeManager.GetNode(storageNode.NodeId); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { Select(session, initialEntitiesCount); @@ -106,7 +106,7 @@ protected void PopulateInitialDataForNodes() map = new Dictionary>>(); foreach (var storageNode in nodes) { var typesMap = new Dictionary>(); - var selectedNode = domain.SelectStorageNode(storageNode.NodeId); + var selectedNode = domain.StorageNodeManager.GetNode(storageNode.NodeId); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var type = typeof(model.Part1.TestEntity1); diff --git a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs index 4aba18e79b..9ab9dde1da 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/SchemaSharing/KeyGenerator/SimpleTest.cs @@ -35,7 +35,7 @@ public void MainTest() var longSequence = referenceDomain.Model.Types[typeof(model.Part1.TestEntity2)].Hierarchy.Key.Sequence; foreach (var node in skipParametersPerNode) { - var selectedNode = referenceDomain.SelectStorageNode(node.Key.NodeId); + var selectedNode = referenceDomain.StorageNodeManager.GetNode(node.Key.NodeId); using (var session = selectedNode.OpenSession()) { var skipCount = node.Value; for (int i = 0; i < skipCount; i++) { @@ -58,7 +58,7 @@ public void MainTest() var longSequence = testDomain.Model.Types[typeof(model.Part1.TestEntity2)].Hierarchy.Key.Sequence; foreach (var node in skipParametersPerNode) { - var selectedNode = testDomain.SelectStorageNode(node.Key.NodeId); + var selectedNode = testDomain.StorageNodeManager.GetNode(node.Key.NodeId); using (var session = selectedNode.OpenSession()) { var expectedIntOffset = node.Value * 128 + 1; var expectedLongOffset = node.Value * 128 + 1; diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs index 6dfdbfb9c9..4945fdde32 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/DatabasePerNodeTest.cs @@ -38,7 +38,7 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); @@ -58,7 +58,7 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs index fc694c168f..4ebb4122b3 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/MappedTypesNodesTest.cs @@ -38,7 +38,7 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); @@ -57,7 +57,7 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs index 8fd0942d47..132af7be9a 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/SchemaPerNodeTest.cs @@ -38,7 +38,7 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) { using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); @@ -58,7 +58,7 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs index 0f5ee6fe94..de1b83d27b 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoDatabasesPerNodeTest.cs @@ -48,7 +48,7 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); @@ -66,7 +66,7 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs index 1868d625ba..d8d503144a 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/HugeModelUpgrade/TwoSchemasPerNodeTest.cs @@ -51,7 +51,7 @@ protected override void PopulateData(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var populator = new ModelPopulator(); @@ -69,7 +69,7 @@ protected override void CheckIfQueriesWork(Domain domain) }; foreach (var node in nodes) { - var selectedNode = domain.SelectStorageNode(node); + var selectedNode = domain.StorageNodeManager.GetNode(node); using (var session = domain.OpenSession()) using (var transaction = session.OpenTransaction()) { var checker = new ModelChecker(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs index 554e201ed3..e9157a9189 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleDatabaseNodeTest.cs @@ -76,7 +76,7 @@ protected override DomainConfiguration BuildConfiguration() private void PopulateNodeData(Domain domain, string nodeIdentifier) { - var selectedNode = domain.SelectStorageNode(nodeIdentifier); + var selectedNode = domain.StorageNodeManager.GetNode(nodeIdentifier); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { CreateEntities(); @@ -86,7 +86,7 @@ private void PopulateNodeData(Domain domain, string nodeIdentifier) private void TestNode(Domain domain, string nodeIdentifier) { - var selectedNode = domain.SelectStorageNode(nodeIdentifier); + var selectedNode = domain.StorageNodeManager.GetNode(nodeIdentifier); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var countriesCount = session.Query.All().Count(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs index b120b8ce73..5397a6c277 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/NewSkip/SingleSchemaNodeBuildingTest.cs @@ -79,7 +79,7 @@ protected override DomainConfiguration BuildConfiguration() private void PopulateNodeData(Domain domain, string nodeIdentifier) { - var selectedNode = domain.SelectStorageNode(nodeIdentifier); + var selectedNode = domain.StorageNodeManager.GetNode(nodeIdentifier); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { CreateEntities(); @@ -89,7 +89,7 @@ private void PopulateNodeData(Domain domain, string nodeIdentifier) private void TestNode(Domain domain, string nodeIdentifier) { - var selectedNode = domain.SelectStorageNode(nodeIdentifier); + var selectedNode = domain.StorageNodeManager.GetNode(nodeIdentifier); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var countriesCount = session.Query.All().Count(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs index d02c51dc65..48a94919c3 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/IgnoreRulesTest.cs @@ -139,7 +139,7 @@ private void PopulateData(Domain domain) : new List() { MainNodeId }; foreach (var storageNode in storageNodes) { - var selectedNode = domain.SelectStorageNode(storageNode); + var selectedNode = domain.StorageNodeManager.GetNode(storageNode); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var euro = new Currency() { Name = "Euro", ShortName = "EU" }; @@ -166,7 +166,7 @@ private void ValidateDomainData(Domain domain) : new List() { MainNodeId }; foreach (var storageNode in storageNodes) { - var selectedNode = domain.SelectStorageNode(storageNode); + var selectedNode = domain.StorageNodeManager.GetNode(storageNode); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs index da68a69f57..2c847cccaf 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/QueryBuilder/SimpleTest.cs @@ -86,7 +86,7 @@ private void BuildInitialDomain() } foreach (var nodeConfiguration in nodes) { - var selectedNode = domain.SelectStorageNode(nodeConfiguration.NodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); using (var session = selectedNode.OpenSession()) using (session.Activate()) using (var transaction = session.OpenTransaction()) { diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs index ce1308fc55..57daf1014b 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/Requests/SimpleTest.cs @@ -60,8 +60,8 @@ protected void BuildInitialDomain() } foreach (var nodeConfiguration in nodes) { - var selecteNode = domain.SelectStorageNode(nodeConfiguration.NodeId); - using (var session = selecteNode.OpenSession()) + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); + using (var session = selectedNode.OpenSession()) using (session.Activate()) using (var transaction = session.OpenTransaction()) { _ = new model.Part1.TestEntity1 { Text = session.StorageNodeId }; diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs index 399a2150ac..9588d16b5c 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/SqlExecutor/SimpleTest.cs @@ -87,7 +87,7 @@ private void BuildInitialDomain() } foreach (var nodeConfiguration in nodes) { - var selectedNode = domain.SelectStorageNode(nodeConfiguration.NodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); using (var session = selectedNode.OpenSession()) { using (session.Activate()) using (var transaction = session.OpenTransaction()) { diff --git a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs index 05d47aa293..cf2e3c383c 100644 --- a/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs +++ b/Orm/Xtensive.Orm.Tests/Upgrade/SchemaSharing/StorageNodeBuildingTest.cs @@ -222,7 +222,7 @@ private void RunRecreateTest(bool shareStorageSchemaOverNodes) private void PopulateData(Domain domain, string nodeId) { - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) using (var transaction = session.OpenTransaction()) { var euro = new Currency() { Name = "Euro", ShortName = "EU" }; @@ -263,9 +263,8 @@ private void ValidateNodesShareSchema(Domain domain) private void ValidateData(Domain domain, string nodeId) { - var selectedNode = domain.SelectStorageNode(nodeId); + var selectedNode = domain.StorageNodeManager.GetNode(nodeId); using (var session = selectedNode.OpenSession()) - using (var transaction = session.OpenTransaction()) { var currencies = session.Query.All().OrderBy(c => c.Name).ToArray(); Assert.That(currencies.Length, Is.EqualTo(3)); diff --git a/Orm/Xtensive.Orm/Orm/Domain.cs b/Orm/Xtensive.Orm/Orm/Domain.cs index 31dc1326a8..af3ea88dd3 100644 --- a/Orm/Xtensive.Orm/Orm/Domain.cs +++ b/Orm/Xtensive.Orm/Orm/Domain.cs @@ -105,26 +105,6 @@ public static Domain Demand() /// public StorageNodeManager StorageNodeManager { get; private set; } - /// - /// Selects storage node. - /// - /// Node identifier. - /// Node selection allowing storage node dependant operations. - /// /// - /// using (var session = Domain.SelectStorageNode(nodeId).OpenSession()) { - /// // work with persistent objects here. - /// } - /// - /// with given identifier does not exist. - public ISessionSource SelectStorageNode([NotNull]string storageNodeId) - { - var node = StorageNodeManager.GetNode(storageNodeId); - if (node == null) { - throw new ArgumentException(string.Format(Strings.ExStorageNodeWithIdXIsNotFound, storageNodeId)); - } - return node; - } - #region Private / internal members internal RecordSetReader RecordSetReader { get; private set; } diff --git a/Orm/Xtensive.Orm/Orm/Session.cs b/Orm/Xtensive.Orm/Orm/Session.cs index 1f4464af3e..41a9d7d91c 100644 --- a/Orm/Xtensive.Orm/Orm/Session.cs +++ b/Orm/Xtensive.Orm/Orm/Session.cs @@ -443,7 +443,7 @@ VersionSet IVersionSetProvider.CreateVersionSet(IEnumerable keys) /// Selects storage node identifier by . /// /// Node identifier. - [Obsolete("Use Domain.SelectStorageNode(nodeId) instead")] + [Obsolete("Use StorageNode instances to open a session to them instead")] public void SelectStorageNode([NotNull] string nodeId) { ArgumentValidator.EnsureArgumentNotNull(nodeId, "nodeId"); From 31166373ebd74e193159d946583d973d8f3a789d Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Thu, 22 Oct 2020 20:34:08 +0500 Subject: [PATCH 13/17] Adds test for StorageNodeManager API --- .../Multinode/StorageNodeManagerTest.cs | 215 ++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs new file mode 100644 index 0000000000..a6890f5577 --- /dev/null +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs @@ -0,0 +1,215 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using Xtensive.Orm.Configuration; +using Xtensive.Orm.Providers; + +namespace Xtensive.Orm.Tests.Storage.Multinode +{ + public class StorageNodeManagerTest : AutoBuildTest + { + [HierarchyRoot] + public class TestEntity : Entity + { + [Field, Key] + public int Id { get; private set; } + } + + private readonly List NodesToClear = new List(); + + protected override void CheckRequirements() + { + Require.ProviderIs(StorageProvider.SqlServer); + } + + protected override DomainConfiguration BuildConfiguration() + { + var config = base.BuildConfiguration(); + config.Types.Register(typeof(TestEntity)); + config.DefaultSchema = "dbo"; + return config; + } + + [SetUp] + public void SetUp() + { + NodesToClear.Clear(); + } + + [TearDown] + public void TearDown() + { + foreach (var nodeName in NodesToClear) { + _ = Domain.StorageNodeManager.RemoveNode(nodeName); + } + } + + [Test] + public void AddUniqueNodeTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + } + + [Test] + public void AddAlreadyExistingTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + _ = Domain.StorageNodeManager.AddNode(nodeConfiguration); + + var sameConfig = (NodeConfiguration)nodeConfiguration.Clone(); + var result = Domain.StorageNodeManager.AddNode(sameConfig); + Assert.That(result, Is.False); + } + + [Test] + public void AddNodeWithNullNameTest() + { + var nodeConfiguration = new NodeConfiguration() { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + _ = Assert.Throws(() => Domain.StorageNodeManager.AddNode(nodeConfiguration)); + } + + [Test] + public void AddNodeWithEmptyNameTest() + { + var nodeConfiguration = new NodeConfiguration(string.Empty) { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + _ = Assert.Throws(() => Domain.StorageNodeManager.AddNode(nodeConfiguration)); + } + + [Test] + public void AddNodeWithNullConfigTest() + { + _ = Assert.Throws(() => Domain.StorageNodeManager.AddNode(null)); + } + + [Test] + public void AddNodeForMultidatabaseDomainTest() + { + var nodeConfiguration = new NodeConfiguration() { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfiguration.DatabaseMapping.Add("DO-Tests", "DO-Tests-1"); + _ = Assert.Throws(() => Domain.StorageNodeManager.AddNode(nodeConfiguration)); + } + + [Test] + public void GetNodeByNullStringTest() + { + _ = Assert.Throws(() => Domain.StorageNodeManager.GetNode(null)); + } + + [Test] + public void GetNodeByEmptyStringTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + + var node = Domain.StorageNodeManager.GetNode(string.Empty); + + Assert.That(node, Is.Not.Null); + Assert.That(node.Id, Is.Not.EqualTo(nodeConfiguration.NodeId)); + } + + [Test] + public void GetNodeByExistingNodeNameTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + + var node = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); + + Assert.That(node, Is.Not.Null); + Assert.That(node.Id, Is.EqualTo(nodeConfiguration.NodeId)); + } + + [Test] + public void GetNodeWhichDoesntExistTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + + var node = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId + "dummy"); + + Assert.That(node, Is.Null); + } + + [Test] + public void RemoveNodeWhichDoesntExistTest() + { + var result = Domain.StorageNodeManager.RemoveNode("dummy"); + Assert.That(result, Is.False); + } + + [Test] + public void RemoveExistingNode() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + + result = Domain.StorageNodeManager.RemoveNode(nodeConfiguration.NodeId); + Assert.That(result, Is.True); + } + + [Test] + public void GetOrAddByConfigWithNullNameTest() + { + var nodeConfiguration = new NodeConfiguration() { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + _ = Assert.Throws(() => Domain.StorageNodeManager.GetOrAddNode(nodeConfiguration)); + } + + [Test] + public void GetOrAddByConfigWithEmptyNameTest() + { + var nodeConfiguration = new NodeConfiguration(string.Empty) { UpgradeMode = DomainUpgradeMode.Recreate }; + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + _ = Assert.Throws(() => Domain.StorageNodeManager.GetOrAddNode(nodeConfiguration)); + } + + [Test] + public void GetOrAddByConfigOfExistingNodeTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); + Assert.That(result, Is.True); + var existingNode = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); + + var node = Domain.StorageNodeManager.GetOrAddNode((NodeConfiguration)nodeConfiguration.Clone()); + Assert.That(node, Is.EqualTo(existingNode)); + } + + [Test] + public void GetOrAddByConfigOfAbsentNodeTest() + { + var nodeConfiguration = GetBaseNodeConfig(); + nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); + var existingNode = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); + Assert.That(existingNode, Is.Null); + + var node = Domain.StorageNodeManager.GetOrAddNode((NodeConfiguration) nodeConfiguration.Clone()); + Assert.That(node, Is.Not.Null); + } + + private NodeConfiguration GetBaseNodeConfig() + { + var nodeConfiguration = new NodeConfiguration(Guid.NewGuid().ToString()) { + UpgradeMode = DomainUpgradeMode.Recreate + }; + NodesToClear.Add(nodeConfiguration.NodeId); + return nodeConfiguration; + } + } +} From 1ee4938b5516c02e68edff5652ec3bad69a58a28 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Mon, 26 Oct 2020 20:57:59 +0500 Subject: [PATCH 14/17] Returns old api for StorageNodeManager --- .../Multinode/ConnectionOverrideTest.cs | 6 ++- .../Storage/Multinode/DynamicTypeIdTest.cs | 3 +- .../InitializationSqlOverrideTest.cs | 9 ++-- .../Multinode/StorageNodeManagerTest.cs | 41 ------------------- Orm/Xtensive.Orm/Orm/StorageNodeManager.cs | 25 ----------- 5 files changed, 12 insertions(+), 72 deletions(-) diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs index 1618dd8c2e..4b157115bb 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs @@ -61,7 +61,8 @@ void commandValidator(object sender, DbCommandEventArgs args) session.Events.DbCommandExecuted -= commandValidator; } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfig.NodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()){ var connection = ((SqlSessionHandler) session.Handler).Connection; @@ -113,7 +114,8 @@ void commandValidator(object sender, DbCommandEventArgs args) session.Events.DbCommandExecuted -= commandValidator; } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfig.NodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var connection = ((SqlSessionHandler) session.Handler).Connection; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs index 1108887679..dbfb090394 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/DynamicTypeIdTest.cs @@ -343,7 +343,8 @@ public void TypeIdExtractionTest() } } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfiguration); + _ = domain.StorageNodeManager.AddNode(nodeConfiguration); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); using (var session = selectedNode.OpenSession()) { var types = new[] { typeof(BaseEntity), typeof(Entity1), typeof(Entity2) }; foreach (var type in types) { diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs index f6e643ac59..406215329a 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs @@ -51,7 +51,8 @@ public void NullNodeInitSql() } } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfig.NodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); @@ -92,7 +93,8 @@ public void EmptyStringIninSql() } } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfig.NodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); @@ -133,7 +135,8 @@ public void ValidInitSql() } } - var selectedNode = domain.StorageNodeManager.GetOrAddNode(nodeConfig); + _ = domain.StorageNodeManager.AddNode(nodeConfig); + var selectedNode = domain.StorageNodeManager.GetNode(nodeConfig.NodeId); using (var session = selectedNode.OpenSession()) using (var tx = session.OpenTransaction()) { var service = session.Services.Get(); diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs index a6890f5577..07e7fbf3a8 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/StorageNodeManagerTest.cs @@ -162,47 +162,6 @@ public void RemoveExistingNode() Assert.That(result, Is.True); } - [Test] - public void GetOrAddByConfigWithNullNameTest() - { - var nodeConfiguration = new NodeConfiguration() { UpgradeMode = DomainUpgradeMode.Recreate }; - nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); - _ = Assert.Throws(() => Domain.StorageNodeManager.GetOrAddNode(nodeConfiguration)); - } - - [Test] - public void GetOrAddByConfigWithEmptyNameTest() - { - var nodeConfiguration = new NodeConfiguration(string.Empty) { UpgradeMode = DomainUpgradeMode.Recreate }; - nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); - _ = Assert.Throws(() => Domain.StorageNodeManager.GetOrAddNode(nodeConfiguration)); - } - - [Test] - public void GetOrAddByConfigOfExistingNodeTest() - { - var nodeConfiguration = GetBaseNodeConfig(); - nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); - var result = Domain.StorageNodeManager.AddNode(nodeConfiguration); - Assert.That(result, Is.True); - var existingNode = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); - - var node = Domain.StorageNodeManager.GetOrAddNode((NodeConfiguration)nodeConfiguration.Clone()); - Assert.That(node, Is.EqualTo(existingNode)); - } - - [Test] - public void GetOrAddByConfigOfAbsentNodeTest() - { - var nodeConfiguration = GetBaseNodeConfig(); - nodeConfiguration.SchemaMapping.Add("dbo", "Model1"); - var existingNode = Domain.StorageNodeManager.GetNode(nodeConfiguration.NodeId); - Assert.That(existingNode, Is.Null); - - var node = Domain.StorageNodeManager.GetOrAddNode((NodeConfiguration) nodeConfiguration.Clone()); - Assert.That(node, Is.Not.Null); - } - private NodeConfiguration GetBaseNodeConfig() { var nodeConfiguration = new NodeConfiguration(Guid.NewGuid().ToString()) { diff --git a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs index 85a73cffb8..9387c6dd5e 100644 --- a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs +++ b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs @@ -52,31 +52,6 @@ public StorageNode GetNode([NotNull] string nodeId) return handlers.StorageNodeRegistry.TryGet(nodeId); } - /// - /// Gets node with .NodeId if it exists, otherwise, - /// adds node with the specified and performs required upgrade actions - /// and return added node. - /// - /// Node configuration. - /// Given configurations has no specified. - /// New node cannot be registered. - [NotNull] - public StorageNode GetOrAddNode([NotNull] NodeConfiguration configuration) - { - if (string.IsNullOrEmpty(configuration.NodeId)) { - throw new InvalidOperationException(Strings.ExInvalidNodeIdentifier); - } - var node = GetNode(configuration.NodeId); - if (node != null) { - return node; - } - node = UpgradingDomainBuilder.BuildNode(handlers.Domain, configuration); - return handlers.StorageNodeRegistry.Add(node) - ? node - : throw new InvalidOperationException("Node was build but couldn't be registered."); - } - - // Constructors internal StorageNodeManager(HandlerAccessor handlers) From dfbbcc371e10c315c324249ff7255d1466bd1fae Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Mon, 26 Oct 2020 21:15:51 +0500 Subject: [PATCH 15/17] Files' copyright update --- .../Storage/Multinode/ConnectionOverrideTest.cs | 4 ++++ .../Storage/Multinode/InitializationSqlOverrideTest.cs | 4 ++++ .../Storage/Multinode/ObsoleteSelectStorageNodeTest.cs | 4 ++++ Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs | 6 +++--- Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs | 4 ++++ Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs | 6 +++--- Orm/Xtensive.Orm/Orm/Session.cs | 6 +++--- Orm/Xtensive.Orm/Orm/StorageNode.cs | 6 +++--- Orm/Xtensive.Orm/Orm/StorageNodeManager.cs | 6 +++--- Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs | 6 +++--- 10 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs index 4b157115bb..a918ef1afe 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ConnectionOverrideTest.cs @@ -1,3 +1,7 @@ +// Copyright (C) 2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + using System; using System.Collections.Generic; using System.Text; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs index 406215329a..a3d00af98c 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/InitializationSqlOverrideTest.cs @@ -1,3 +1,7 @@ +// Copyright (C) 2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + using System; using System.Collections.Generic; using System.Text; diff --git a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs index 6c0df1cea7..9fc8f3adaf 100644 --- a/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs +++ b/Orm/Xtensive.Orm.Tests/Storage/Multinode/ObsoleteSelectStorageNodeTest.cs @@ -1,3 +1,7 @@ +// Copyright (C) 2014-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + using System; using System.Collections.Generic; using System.Text; diff --git a/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs b/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs index 9e8fa11743..b801432700 100644 --- a/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Building/Builders/DomainBuilder.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2007-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Dmitri Maximov // Created: 2007.08.03 diff --git a/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs b/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs index 328215a88a..a892dbcbd0 100644 --- a/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs +++ b/Orm/Xtensive.Orm/Orm/Interfaces/ISessionSource.cs @@ -1,3 +1,7 @@ +// Copyright (C) 2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. + using System.Threading; using System.Threading.Tasks; using Xtensive.Orm; diff --git a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs index 4b9a576287..c076cf4123 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2009-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Denis Krjuchkov // Created: 2009.08.14 diff --git a/Orm/Xtensive.Orm/Orm/Session.cs b/Orm/Xtensive.Orm/Orm/Session.cs index 41a9d7d91c..cc01c5f6a4 100644 --- a/Orm/Xtensive.Orm/Orm/Session.cs +++ b/Orm/Xtensive.Orm/Orm/Session.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2007-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Dmitri Maximov // Created: 2007.08.10 diff --git a/Orm/Xtensive.Orm/Orm/StorageNode.cs b/Orm/Xtensive.Orm/Orm/StorageNode.cs index 56760cc5ce..62914ed18e 100644 --- a/Orm/Xtensive.Orm/Orm/StorageNode.cs +++ b/Orm/Xtensive.Orm/Orm/StorageNode.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2014-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Denis Krjuchkov // Created: 2014.03.13 diff --git a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs index 9387c6dd5e..7966637612 100644 --- a/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs +++ b/Orm/Xtensive.Orm/Orm/StorageNodeManager.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2014 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2014-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Denis Krjuchkov // Created: 2014.03.13 diff --git a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs index 457cc07001..c50cbc6c84 100644 --- a/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs +++ b/Orm/Xtensive.Orm/Orm/Upgrade/UpgradingDomainBuilder.cs @@ -1,6 +1,6 @@ -// Copyright (C) 2003-2010 Xtensive LLC. -// All rights reserved. -// For conditions of distribution and use, see license. +// Copyright (C) 2009-2020 Xtensive LLC. +// This code is distributed under MIT license terms. +// See the License.txt file in the project root for more information. // Created by: Alex Kofman // Created: 2009.04.23 From cf2cead4ba4de5cbc8e2964d5240b44fe7bc16f5 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Mon, 26 Oct 2020 21:47:01 +0500 Subject: [PATCH 16/17] Forbids to use Session.SelectStorageNode for sessions with opened connection --- .../Orm/Providers/StorageDriver.Operations.cs | 10 ++++++++-- Orm/Xtensive.Orm/Strings.Designer.cs | 9 +++++++++ Orm/Xtensive.Orm/Strings.resx | 3 +++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs index c076cf4123..0cbc566e58 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs @@ -23,11 +23,17 @@ private sealed class InitializationSqlExtension public void ApplyNodeConfiguration(SqlConnection connection, NodeConfiguration nodeConfiguration) { - if (nodeConfiguration.ConnectionInfo!=null) + if (connection.State != ConnectionState.Closed) { + throw new InvalidOperationException(Strings.ExCannotApplyNodeConfigurationSettingsConnectionIsInUse); + } + + if (nodeConfiguration.ConnectionInfo != null) { connection.ConnectionInfo = nodeConfiguration.ConnectionInfo; + } - if (!string.IsNullOrEmpty(nodeConfiguration.ConnectionInitializationSql)) + if (!string.IsNullOrEmpty(nodeConfiguration.ConnectionInitializationSql)) { SetInitializationSql(connection, nodeConfiguration.ConnectionInitializationSql); + } } public SqlConnection CreateConnection(Session session) diff --git a/Orm/Xtensive.Orm/Strings.Designer.cs b/Orm/Xtensive.Orm/Strings.Designer.cs index 16395271a5..06d51b34c7 100644 --- a/Orm/Xtensive.Orm/Strings.Designer.cs +++ b/Orm/Xtensive.Orm/Strings.Designer.cs @@ -839,6 +839,15 @@ internal static string ExCannotActivateServiceXWithKeyYErrorZ { } } + /// + /// Looks up a localized string similar to Cannot apply node configuration: connection is already in use. This may happen if the session was open asynchronously. Use new StorageNode.OpenSession(...) API instead of Session.SelectStorageNode(...). + /// + internal static string ExCannotApplyNodeConfigurationSettingsConnectionIsInUse { + get { + return ResourceManager.GetString("ExCannotApplyNodeConfigurationSettingsConnectionIsInUse", resourceCulture); + } + } + /// /// Looks up a localized string similar to Attempt to associate non-empty EntityState with Key of unknown type.. /// diff --git a/Orm/Xtensive.Orm/Strings.resx b/Orm/Xtensive.Orm/Strings.resx index 45054a32eb..61f65aac41 100644 --- a/Orm/Xtensive.Orm/Strings.resx +++ b/Orm/Xtensive.Orm/Strings.resx @@ -3446,4 +3446,7 @@ Error: {1} The Key belongs to different storage node. + + Cannot apply node configuration: connection is already in use. This may happen if the session was open asynchronously. Use new StorageNode.OpenSession(...) API instead of Session.SelectStorageNode(...) + \ No newline at end of file From 39aecf5841577e3fb94bbdd184b5a4b312560c01 Mon Sep 17 00:00:00 2001 From: Alexey Kulakov Date: Tue, 27 Oct 2020 01:21:12 +0500 Subject: [PATCH 17/17] Skips connection check for default node --- Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs index 0cbc566e58..75e269e53d 100644 --- a/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs +++ b/Orm/Xtensive.Orm/Orm/Providers/StorageDriver.Operations.cs @@ -23,7 +23,8 @@ private sealed class InitializationSqlExtension public void ApplyNodeConfiguration(SqlConnection connection, NodeConfiguration nodeConfiguration) { - if (connection.State != ConnectionState.Closed) { + if (connection.State != ConnectionState.Closed + && !nodeConfiguration.NodeId.Equals(WellKnown.DefaultNodeId, StringComparison.Ordinal )) { throw new InvalidOperationException(Strings.ExCannotApplyNodeConfigurationSettingsConnectionIsInUse); }