Пример #1
0
        /// <summary>
        /// Gets the provider manifest for given provider manifest token.
        /// </summary>
        /// <param name="manifestToken">The provider manifest token.</param>
        /// <returns><see cref="DbProviderManifest"/> for a given token.</returns>
        protected override System.Data.Entity.Core.Common.DbProviderManifest GetDbProviderManifest(string manifestToken)
        {
            string providerInvariantName;
            string realToken;

            // check if the name of the wrapped provider is specified in the token
            int p = manifestToken.IndexOf(';');

            if (p < 0)
            {
                // wrapped provider is not in the token - use default one
                realToken             = manifestToken;
                providerInvariantName = this.DefaultWrappedProviderName;
            }
            else
            {
                // extract provider name from the token
                providerInvariantName = manifestToken.Substring(0, p);
                realToken             = manifestToken.Substring(p + 1);
            }

            // retrieve wrapped provider manifest
            System.Data.Entity.Core.Common.DbProviderServices services = GetProviderServicesByName(providerInvariantName);
            System.Data.Entity.Core.Common.DbProviderManifest wrappedProviderManifest = services.GetProviderManifest(realToken);
            System.Data.Entity.Core.Common.DbProviderManifest wrapperManifest         = this.CreateProviderManifest(providerInvariantName, wrappedProviderManifest);

            return(wrapperManifest);
        }
Пример #2
0
        /// <summary>
        /// Wraps the provided DbProviderServices class in a MiniProfiler profiled DbService and returns the wrapped service.
        /// </summary>
        /// <param name="services">The DbProviderServices service to wrap.</param>
        /// <returns>A wrapped version of the DbProviderService service.</returns>
        private static DbProviderServices WrapProviderService(DbProviderServices services)
        {
            // First let's check our cache.
            if (ProviderCache.ContainsKey(services))
            {
                return ProviderCache[services];
            }

            // Then let's see if our type is already wrapped.
            var serviceType = services.GetType();
            while (serviceType != null)
            {
                if (serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(EFProfiledDbProviderServices<>))
                {
                    // Add it to the cache and return it.
                    ProviderCache[services] = services;
                    return services;
                }

                serviceType = serviceType.BaseType;
            }

            // Finally let's wrap it.
            var genericType = typeof(EFProfiledDbProviderServices<>);
            Type[] typeArgs = { services.GetType() };
            var createdType = genericType.MakeGenericType(typeArgs);
            var instanceProperty = createdType.GetField("Instance", BindingFlags.Public | BindingFlags.Static);
            var instance = instanceProperty.GetValue(null) as DbProviderServices;
            ProviderCache[services] = instance;
            return instance;
        }
        public NamedDbProviderService(string invariantName, DbProviderServices providerServices)
        {
            DebugCheck.NotEmpty(invariantName);
            DebugCheck.NotNull(providerServices);

            _invariantName = invariantName;
            _providerServices = providerServices;
        }
Пример #4
0
        /// <summary>
        /// Gets the provider manifest token.
        /// </summary>
        /// <param name="connection">The database connection.</param>
        /// <returns>Provider Manfiest Token suitable for inclusion in SSDL file and connection string</returns>
        /// <remarks>
        /// The provider manifest token is created by concatenating wrapped provider invariant name and its
        /// token separated by semicolon, for example when wrapping SqlClient for SQL Server 2005 the provider
        /// manifest token will be "System.Data.SqlClient;2005"
        /// </remarks>
        protected override string GetDbProviderManifestToken(DbConnection connection)
        {
            DbConnectionWrapper wrapper           = (DbConnectionWrapper)connection;
            DbConnection        wrappedConnection = wrapper.WrappedConnection;

            System.Data.Entity.Core.Common.DbProviderServices services = System.Data.Entity.Core.Common.DbProviderServices.GetProviderServices(wrappedConnection);

            string token = wrapper.WrappedProviderInvariantName + ";" + services.GetProviderManifestToken(wrappedConnection);

            return(token);
        }
            public void ExpandDataDirectory_correctly_concatenates_paths_with_correct_number_of_slashes()
            {
                TestWithDataDirectory(
                    @"C:\MelancholyBlues",
                    () => Assert.Equal(@"C:\MelancholyBlues\", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|")));

                TestWithDataDirectory(
                    @"C:\MelancholyBlues\",
                    () => Assert.Equal(@"C:\MelancholyBlues\", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|")));

                TestWithDataDirectory(
                    null,
                    () => Assert.Equal(@"\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|SheerHeartAttack")));

                TestWithDataDirectory(
                    null,
                    () => Assert.Equal(@"\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|\SheerHeartAttack")));

                TestWithDataDirectory(
                    @"C:\MelancholyBlues",
                    () =>
                    Assert.Equal(
                        @"C:\MelancholyBlues\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|SheerHeartAttack")));

                TestWithDataDirectory(
                    @"C:\MelancholyBlues",
                    () =>
                    Assert.Equal(
                        @"C:\MelancholyBlues\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|\SheerHeartAttack")));

                TestWithDataDirectory(
                    @"C:\MelancholyBlues\",
                    () =>
                    Assert.Equal(
                        @"C:\MelancholyBlues\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|SheerHeartAttack")));

                TestWithDataDirectory(
                    @"C:\MelancholyBlues\",
                    () =>
                    Assert.Equal(
                        @"C:\MelancholyBlues\SheerHeartAttack", DbProviderServices.ExpandDataDirectory(@"|DataDirectory|\SheerHeartAttack")));
            }
            public void GetSpatialServices_with_EntityConnection_uses_provider_from_store_connection_if_resolver_returns_null()
            {
                var mockItemCollection = new Mock <StoreItemCollection>();

                mockItemCollection.Setup(m => m.ProviderInvariantName).Returns("I'm.So.Free");
                mockItemCollection.Setup(m => m.ProviderManifestToken).Returns("2008");

                var mockWorkspace = new Mock <MetadataWorkspace>();

                mockWorkspace.Setup(m => m.GetItemCollection(DataSpace.SSpace)).Returns(mockItemCollection.Object);

                var mockConnection = new Mock <EntityConnection>();

                mockConnection.Setup(m => m.GetMetadataWorkspace()).Returns(mockWorkspace.Object);
                mockConnection.Setup(m => m.StoreConnection).Returns(new SqlConnection());

                Assert.Same(
                    SqlSpatialServices.Instance,
                    DbProviderServices.GetSpatialServices(new Mock <IDbDependencyResolver>().Object, mockConnection.Object));
            }
            public void Static_method_dispatches_to_interceptors()
            {
                var dbConnectionInterceptorMock = new Mock <IDbConnectionInterceptor>();

                var model = EdmModel.CreateStoreModel(
                    new DbProviderInfo("System.Data.FakeSqlClient", "2008"),
                    new SqlProviderManifest("2008"));

                var storeItemCollectionMock = new Mock <StoreItemCollection>(model)
                {
                    CallBase = true
                };

                var metadataWorkspaceMock = new Mock <MetadataWorkspace>();

                metadataWorkspaceMock.Setup(m => m.GetItemCollection(DataSpace.SSpace)).Returns(storeItemCollectionMock.Object);

                var connectionMock   = new Mock <DbConnection>();
                var entityConnection = new EntityConnection(
                    workspace: null, connection: connectionMock.Object, skipInitialization: true, entityConnectionOwnsStoreConnection: false);

                DbInterception.Add(dbConnectionInterceptorMock.Object);
                try
                {
                    DbProviderServices.GetExecutionStrategy(entityConnection, metadataWorkspaceMock.Object);
                }
                finally
                {
                    DbInterception.Remove(dbConnectionInterceptorMock.Object);
                }

                dbConnectionInterceptorMock.Verify(
                    m => m.DataSourceGetting(It.IsAny <DbConnection>(), It.IsAny <DbConnectionInterceptionContext <string> >()),
                    Times.Once());
                dbConnectionInterceptorMock.Verify(
                    m => m.DataSourceGot(It.IsAny <DbConnection>(), It.IsAny <DbConnectionInterceptionContext <string> >()),
                    Times.Once());
            }
Пример #8
0
        private Func <System.Data.Entity.Core.Common.DbProviderManifest, System.Data.Entity.Core.Common.CommandTrees.DbCommandTree, System.Data.Entity.Core.Common.DbCommandDefinition> GetCreateDbCommandDefinitionFunction(string providerInvariantName)
        {
            Func <System.Data.Entity.Core.Common.DbProviderManifest, System.Data.Entity.Core.Common.CommandTrees.DbCommandTree, System.Data.Entity.Core.Common.DbCommandDefinition> result;

            lock (this.createDbCommandDefinitionFunctions)
            {
                if (!this.createDbCommandDefinitionFunctions.TryGetValue(providerInvariantName, out result))
                {
                    System.Data.Entity.Core.Common.DbProviderServices ps = GetProviderServicesByName(providerInvariantName);

                    // create a delegate to call CreateDbCommandDefinition using reflection
                    // (method is protected, but part of public API)
                    MethodInfo createCommandDefinitionMethodInfo = ps.GetType().GetMethod("CreateDbCommandDefinition", BindingFlags.NonPublic | BindingFlags.Instance);
                    result = (Func <System.Data.Entity.Core.Common.DbProviderManifest, System.Data.Entity.Core.Common.CommandTrees.DbCommandTree, System.Data.Entity.Core.Common.DbCommandDefinition>)Delegate.CreateDelegate(
                        typeof(Func <System.Data.Entity.Core.Common.DbProviderManifest, System.Data.Entity.Core.Common.CommandTrees.DbCommandTree, System.Data.Entity.Core.Common.DbCommandDefinition>),
                        ps,
                        createCommandDefinitionMethodInfo);
                    this.createDbCommandDefinitionFunctions[providerInvariantName] = result;
                }
            }

            return(result);
        }
Пример #9
0
        /// <summary>
        /// Gets provider services object given provider invariant name.
        /// </summary>
        /// <param name="providerInvariantName">Provider invariant name.</param>
        /// <returns><see cref="DbProviderServices"/> object for a given invariant name.</returns>
        private static System.Data.Entity.Core.Common.DbProviderServices GetProviderServicesByName(string providerInvariantName)
        {
            DbProviderFactory factory = DbProviderFactories.GetFactory(providerInvariantName);

            if (factory == null)
            {
                throw new ArgumentException("Invalid provider factory: " + providerInvariantName);
            }

            IServiceProvider serviceProvider = factory as IServiceProvider;

            if (serviceProvider == null)
            {
                throw new ArgumentException("Provider does not support Entity Framework - IServiceProvider is not supported");
            }

            System.Data.Entity.Core.Common.DbProviderServices providerServices = (System.Data.Entity.Core.Common.DbProviderServices)serviceProvider.GetService(typeof(System.Data.Entity.Core.Common.DbProviderServices));
            if (providerServices == null)
            {
                throw new ArgumentException("Provider does not support Entity Framework - DbProviderServices is not supported");
            }

            return(providerServices);
        }
 public void GetProviderServices_returns_provider_registered_in_app_config()
 {
     Assert.Same(
         FakeSqlProviderServices.Instance,
         DbProviderServices.GetProviderServices(new FakeSqlConnection()));
 }
 public void GetProviderServices_returns_SQL_Server_provider_by_convention()
 {
     Assert.Same(
         SqlProviderServices.Instance,
         DbProviderServices.GetProviderServices(new SqlConnection()));
 }
 /// <summary>
 /// Gets the <see cref="T:System.Data.Entity.Infrastructure.IDbExecutionStrategy" /> that will be used to execute methods that use the specified connection.
 /// This overload should be used by the derived classes for compatability with wrapping providers.
 /// </summary>
 /// <param name="connection">The database connection</param>
 /// <param name="providerInvariantName">The provider invariant name</param>
 /// <returns>
 /// A new instance of <see cref="T:System.Data.Entity.Infrastructure.DbExecutionStrategy" />
 /// </returns>
 protected static IDbExecutionStrategy GetExecutionStrategy(
     DbConnection connection,
     string providerInvariantName)
 {
     return(DbProviderServices.GetExecutionStrategy(connection, DbProviderServices.GetProviderFactory(connection), providerInvariantName));
 }
Пример #13
0
 /// <summary>
 /// Initializes a new instance of the DbProviderFactoryBase class.
 /// </summary>
 /// <param name="providerServices">The provider services.</param>
 protected DbProviderFactoryBase(System.Data.Entity.Core.Common.DbProviderServices providerServices)
 {
     this.services = providerServices;
 }
        internal static DbSpatialServices GetSpatialServices(
            IDbDependencyResolver resolver,
            EntityConnection connection)
        {
            StoreItemCollection itemCollection = (StoreItemCollection)connection.GetMetadataWorkspace().GetItemCollection(DataSpace.SSpace);
            DbProviderInfo      key            = new DbProviderInfo(itemCollection.ProviderInvariantName, itemCollection.ProviderManifestToken);

            return(DbProviderServices.GetSpatialServices(resolver, key, (Func <DbProviderServices>)(() => DbProviderServices.GetProviderServices(connection.StoreConnection))));
        }
            public void Static_method_returns_the_ExecutionStrategy_from_resolver()
            {
                var connectionMock = new Mock <DbConnection>();

                connectionMock.Setup(m => m.DataSource).Returns("FooSource");

                var model = EdmModel.CreateStoreModel(
                    new DbProviderInfo("System.Data.FakeSqlClient", "2008"),
                    new SqlProviderManifest("2008"));

                var storeItemCollectionMock = new Mock <StoreItemCollection>(model)
                {
                    CallBase = true
                };

                var metadataWorkspaceMock = new Mock <MetadataWorkspace>();

                metadataWorkspaceMock.Setup(m => m.GetItemCollection(DataSpace.SSpace)).Returns(storeItemCollectionMock.Object);

                var entityConnection = new EntityConnection(
                    workspace: null, connection: connectionMock.Object, skipInitialization: true, entityConnectionOwnsStoreConnection: false);

                var mockExecutionStrategy = new Mock <IDbExecutionStrategy>().Object;

                MutableResolver.AddResolver <Func <IDbExecutionStrategy> >(
                    k =>
                {
                    var key = k as ExecutionStrategyKey;
                    Assert.Equal("System.Data.FakeSqlClient", key.ProviderInvariantName);
                    Assert.Equal("FooSource", key.ServerName);
                    return((Func <IDbExecutionStrategy>)(() => mockExecutionStrategy));
                });

                var providerFactoryServiceMock = new Mock <IDbProviderFactoryResolver>();

                providerFactoryServiceMock.Setup(m => m.ResolveProviderFactory(It.IsAny <DbConnection>()))
                .Returns(FakeSqlProviderFactory.Instance);

                var dbConnectionInterceptorMock = new Mock <IDbConnectionInterceptor>();

                DbInterception.Add(dbConnectionInterceptorMock.Object);
                MutableResolver.AddResolver <IDbProviderFactoryResolver>(k => providerFactoryServiceMock.Object);
                try
                {
                    Assert.Same(mockExecutionStrategy, DbProviderServices.GetExecutionStrategy(connectionMock.Object));
                    Assert.Same(
                        mockExecutionStrategy, DbProviderServices.GetExecutionStrategy(entityConnection, metadataWorkspaceMock.Object));
                }
                finally
                {
                    MutableResolver.ClearResolvers();
                    DbInterception.Remove(dbConnectionInterceptorMock.Object);
                }

                dbConnectionInterceptorMock.Verify(
                    m => m.DataSourceGetting(It.IsAny <DbConnection>(), It.IsAny <DbConnectionInterceptionContext <string> >()),
                    Times.Exactly(2));
                dbConnectionInterceptorMock.Verify(
                    m => m.DataSourceGot(It.IsAny <DbConnection>(), It.IsAny <DbConnectionInterceptionContext <string> >()),
                    Times.Exactly(2));
                connectionMock.Verify(m => m.DataSource, Times.Exactly(2));
            }
 /// <summary>Gets the spatial services for the <see cref="T:System.Data.Entity.Core.Common.DbProviderServices" />.</summary>
 /// <returns>The spatial services.</returns>
 /// <param name="key">Information about the database that the spatial services will be used for.</param>
 public DbSpatialServices GetSpatialServices(DbProviderInfo key)
 {
     return(DbProviderServices.GetSpatialServices(this._resolver.Value, key, (Func <DbProviderServices>)(() => this)));
 }
 /// <summary>
 /// Gets the <see cref="T:System.Data.Entity.Infrastructure.IDbExecutionStrategy" /> that will be used to execute methods that use the specified connection.
 /// </summary>
 /// <param name="connection">The database connection</param>
 /// <returns>
 /// A new instance of <see cref="T:System.Data.Entity.Infrastructure.DbExecutionStrategy" />
 /// </returns>
 public static IDbExecutionStrategy GetExecutionStrategy(
     DbConnection connection)
 {
     return(DbProviderServices.GetExecutionStrategy(connection, DbProviderServices.GetProviderFactory(connection), (string)null));
 }
 public void ExpandDataDirectory_returns_the_given_string_if_it_does_not_start_with_DataDirectory_ident()
 {
     Assert.Null(DbProviderServices.ExpandDataDirectory(null));
     Assert.Equal("", DbProviderServices.ExpandDataDirectory(""));
     Assert.Equal("It's Late", DbProviderServices.ExpandDataDirectory("It's Late"));
 }
 /// <summary>Returns providers given a connection.</summary>
 /// <returns>
 /// The <see cref="T:System.Data.Entity.Core.Common.DbProviderServices" /> instanced based on the specified connection.
 /// </returns>
 /// <param name="connection">Connection to provider.</param>
 public static DbProviderServices GetProviderServices(DbConnection connection)
 {
     return(DbProviderServices.GetProviderFactory(connection).GetProviderServices());
 }
Пример #20
0
        protected internal void AddProvider(string providerInvariantName, DbProviderServices provider)
        {
            Contract.Requires(!string.IsNullOrWhiteSpace(providerInvariantName));
            Contract.Requires(provider != null);
            CheckNotLocked("AddProvider");

            AddDependencyResolver(new SingletonDependencyResolver<DbProviderServices>(provider, providerInvariantName));
        }
 /// <summary>
 /// Return an XML reader which represents the CSDL description
 /// </summary>
 /// <param name="csdlName">The name of the CSDL description.</param>
 /// <returns> An XmlReader that represents the CSDL description </returns>
 public static XmlReader GetConceptualSchemaDefinition(string csdlName)
 {
     Check.NotEmpty(csdlName, nameof(csdlName));
     return(DbProviderServices.GetXmlResource("System.Data.Resources.DbProviderServices." + csdlName + ".csdl"));
 }
 public void ExpandDataDirectory_uses_empty_string_if_DataDirectory_is_not_set()
 {
     TestWithDataDirectory(
         null,
         () => Assert.Equal(@"\", DbProviderServices.ExpandDataDirectory("|DataDirectory|")));
 }
        // internal for testing
        internal static string CreateDefiningQuery(EntitySet entitySet, MetadataWorkspace workspace, DbProviderServices providerServices)
        {
            Debug.Assert(entitySet != null, "entitySet != null");
            Debug.Assert(workspace != null, "workspace != null");
            Debug.Assert(providerServices != null, "providerServices != null");

            var inputBinding = entitySet.Scan().BindAs(entitySet.Name);

            var projectList = new List<KeyValuePair<string, DbExpression>>(entitySet.ElementType.Members.Count);
            foreach (var member in entitySet.ElementType.Members)
            {
                Debug.Assert(member.BuiltInTypeKind == BuiltInTypeKind.EdmProperty, "Every member must be a edmproperty");
                var propertyInfo = (EdmProperty)member;
                projectList.Add(
                    new KeyValuePair<string, DbExpression>(
                        member.Name,
                        inputBinding.Variable.Property(propertyInfo)));
            }
            var query = inputBinding.Project(DbExpressionBuilder.NewRow(projectList));
            var dbCommandTree = new DbQueryCommandTree(workspace, DataSpace.SSpace, query);

            return providerServices.CreateCommandDefinition(dbCommandTree).CreateCommand().CommandText;
        }