Пример #1
0
        public void Queries_Projections_CanProjectToJoinObject()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var q = from p in context.Products
                        join s in context.Suppliers on p.Id equals s.Id
                        select new JoinedProductSuppliers
                {
                    Product  = p,
                    Supplier = s
                };

                var result = q.ToList();

                Assert.Equal(2, result.Count());

                Assert.Equal("Banana", result[0].Product.Name);
                Assert.Equal("Bananas-R-Us", result[0].Supplier.Name);

                Assert.Equal("Plum", result[1].Product.Name);
                Assert.Equal("Plums-R-Us", result[1].Supplier.Name);
            }
        }
        public static IServiceCollection AddDataContext(
            this IServiceCollection serviceCollection,
            Action <DataContextOptionsBuilder> builderAction)
        {
            var optionsBuilder = new DataContextOptionsBuilder();

            builderAction.Invoke(optionsBuilder);

            serviceCollection.AddSingleton(typeof(IDbContextOptionsConfigurator), optionsBuilder.Options.DbContextOptionsConfiguratorType);
            serviceCollection.AddSingleton <IDbContextProvider>(x =>
                                                                new DbContextProvider(
                                                                    optionsBuilder.Options.DbContextType,
                                                                    optionsBuilder.Options.DbContextSettings,
                                                                    x.GetRequiredService <IDbContextOptionsConfigurator>()));
            serviceCollection.AddSingleton(typeof(IDataContext), optionsBuilder.Options.DbContextType);

            Type factoryType   = typeof(DesignTimeDbContextFactory <>).MakeGenericType(optionsBuilder.Options.DbContextType);
            Type interfaceType = typeof(IDesignTimeDbContextFactory <>).MakeGenericType(optionsBuilder.Options.DbContextType);

            serviceCollection.AddSingleton(interfaceType, x =>
                                           Activator.CreateInstance(
                                               factoryType,
                                               optionsBuilder.Options.DbContextSettings,
                                               x.GetRequiredService <IDbContextOptionsConfigurator>()));

            return(serviceCollection);
        }
        public static ContainerBuilder AddDataContext(
            this ContainerBuilder containerBuilder,
            Action <DataContextOptionsBuilder> builderAction)
        {
            var optionsBuilder = new DataContextOptionsBuilder();

            builderAction.Invoke(optionsBuilder);

            containerBuilder
            .RegisterType(optionsBuilder.Options.DbContextOptionsConfiguratorType)
            .As(typeof(IDbContextOptionsConfigurator))
            .SingleInstance();
            containerBuilder
            .RegisterType <DbContextProvider>()
            .As(typeof(IDbContextProvider))
            .SingleInstance()
            .WithParameter(TypedParameter.From(optionsBuilder.Options.DbContextType))
            .WithParameter(TypedParameter.From(optionsBuilder.Options.DbContextSettings));
            containerBuilder
            .RegisterType(optionsBuilder.Options.DbContextType)
            .As(typeof(IDataContext))
            .SingleInstance();

            Type factoryType   = typeof(DesignTimeDbContextFactory <>).MakeGenericType(optionsBuilder.Options.DbContextType);
            Type interfaceType = typeof(IDesignTimeDbContextFactory <>).MakeGenericType(optionsBuilder.Options.DbContextType);

            containerBuilder.RegisterType(factoryType)
            .As(interfaceType)
            .SingleInstance()
            .WithParameter(TypedParameter.From(optionsBuilder.Options.DbContextSettings));

            return(containerBuilder);
        }
        public void Querying_LazyLoading_CanLoadEntityCollection()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                Assert.Equal(2, context.Products.Count());

                var query = from p in context.Products
                            where p.Name == "Banana"
                            select p;

                var products = query.ToList <Product>();

                Assert.False(products[0].Parts.IsLoaded);

                var count = products[0].Parts.Count;
                Assert.Equal(3, count);

                var parts = products[0].Parts.ToList();

                Assert.Equal("Bolt", parts[0].Name);
                Assert.Equal("Wrench", parts[1].Name);
                Assert.Equal("Hammer", parts[2].Name);

                Assert.True(products[0].Parts.IsLoaded);
            }
        }
        public static ContainerBuilder AddDataContext(
            this ContainerBuilder containerBuilder,
            Action <DataContextOptionsBuilder> builderAction)
        {
            var optionsBuilder = new DataContextOptionsBuilder();

            builderAction.Invoke(optionsBuilder);

            containerBuilder
            .RegisterType(optionsBuilder.Options.DbContextOptionsConfiguratorType)
            .As(typeof(IDbContextOptionsConfigurator))
            .SingleInstance();

            containerBuilder
            .Register(c =>
            {
                var configurator = c.Resolve <IDbContextOptionsConfigurator>();
                return(new DbContextProvider(
                           optionsBuilder.Options.DbContextType,
                           optionsBuilder.Options.DbContextSettings,
                           configurator));
            })
            .As(typeof(IDbContextProvider))
            .SingleInstance();

            containerBuilder
            .RegisterType <DataContext>()
            .As(typeof(IDataContext))
            .SingleInstance();

            return(containerBuilder);
        }
Пример #6
0
        public void Database_can_delete_by_pk()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                var createResult = context.Database.Creator.CreateIfNotExists();

                var supplier = new Supplier()
                {
                    //Id is autogenerated
                    Name = "TrinketsRUS"
                };

                context.Suppliers.Add(supplier);

                var product = new Product()
                {
                    // Id = 1, Auto generated key
                    Name       = "Banana",
                    Price      = 4.75,
                    SupplierId = supplier.Id
                };

                context.Products.Add(product);
                var productsCount = context.Products.Count();

                Assert.Equal(1, productsCount);

                context.Products.Delete(product);

                Assert.Equal(0, context.Products.Select(p => p.Id).Count());
            }
        }
Пример #7
0
        public async Task Database_can_insert_async()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                var createResult = context.Database.Creator.CreateIfNotExists();

                var supplier = new Supplier()
                {
                    //Id is autogenerated
                    Name = "TrinketsRUS"
                };

                context.Suppliers.Add(supplier);

                var product = new Product()
                {
                    // Id = 1, Auto generated key
                    Name       = "Banana",
                    Price      = 4.75,
                    SupplierId = supplier.Id
                };

                var result = await context.Products.AddAsync(product);

                Assert.Equal(1, result);
            }
        }
        public void Mapping_has_valid_configuration_entity_mapping()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new SimpleDataContext(options))
            {
                Assert.Single(context.Model.EntityMappings);

                var entityMapping = context.Model.EntityMappings.First();
                Assert.IsType <EntityMapping <Address> >(entityMapping);

                var addressEntityMapping = (EntityMapping <Address>)entityMapping;
                Assert.Equal("Address", addressEntityMapping.TableName);

                Assert.Equal(4, addressEntityMapping.ColumnMappings.Count);

                var idPropertyMapping = addressEntityMapping.ColumnMappings.First(p => p.PropertyName == "AddressId");
                Assert.IsType <ColumnMapping>(idPropertyMapping);
                Assert.True(idPropertyMapping.IsKey);

                var streetPropertyMapping = addressEntityMapping.ColumnMappings.First(p => p.PropertyName == "Street");
                Assert.IsType <ColumnMapping>(streetPropertyMapping);
                Assert.False(streetPropertyMapping.IsKey);

                var cityPropertyMapping = addressEntityMapping.ColumnMappings.First(p => p.PropertyName == "City");
                Assert.IsType <ColumnMapping>(cityPropertyMapping);
                Assert.False(cityPropertyMapping.IsKey);
                Assert.Equal("City", cityPropertyMapping.ColumnName);
            }
        }
        public void Mapping_can_get_set_property_value()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new SimpleDataContext(options))
            {
                Assert.Single(context.Model.EntityMappings);

                var entityMapping = context.Model.EntityMappings.First();
                Assert.IsType <EntityMapping <Address> >(entityMapping);

                var addressEntityMapping = (EntityMapping <Address>)entityMapping;

                var testAddress = new Address()
                {
                    AddressId = 1,
                    Street    = "123 Banana Seat",
                    City      = "Somewhere",
                    Country   = "Canada"
                };

                var country = addressEntityMapping.GetColumn(testAddress, "Country");
                Assert.Equal("Canada", country);

                addressEntityMapping.SetColumn(testAddress, "Country", "USA");
                var newCountry = addressEntityMapping.GetColumn(testAddress, "Country");

                Assert.Equal("USA", newCountry);
            }
        }
Пример #10
0
 public static DataContextOptionsBuilder UseEntityFrameworkWithMsSql(
     this DataContextOptionsBuilder builder,
     string?migrationsAsssemblyName = null)
 {
     builder.Options.DbContextOptionsConfiguratorType         = typeof(MsSqlConfigurator);
     builder.Options.DbContextSettings.MigrationsAssemblyName = migrationsAsssemblyName;
     return(builder);
 }
Пример #11
0
 /// <summary>
 /// Uses the postgre database.
 /// </summary>
 /// <returns>The builder.</returns>
 /// <param name="builder">Builder.</param>
 /// <param name="connection">Connection.</param>
 /// <typeparam name="TContext">Data context.</typeparam>
 public static DataContextOptionsBuilder <TContext> UsePostgre <TContext>(this DataContextOptionsBuilder <TContext> builder, string connection) where TContext : DataContext
 {
     builder.SetDataConfig(connection, (configName, configParams) => {
         var database = new PostgreProvider(configName, configParams);
         return(database);
     });
     return(builder);
 }
        public TodoItemDatabase(string dbPath)
        {
            var connectionString = "Data Source=" + dbPath;
            var options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            _dataContext = new TodoDataContext(options);

            _dataContext.Database.Creator.CreateIfNotExists();
        }
Пример #13
0
        public static TodoDataContext Create(string connectionString)
        {
            if (_dataContext == null)
            {
                var options = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

                _dataContext = new TodoDataContext(options);
            }

            return(_dataContext);
        }
Пример #14
0
        public DataContext CreateBuilderContextByConnection()
        {
            var builder = new DataContextOptionsBuilder <DataContext>();

            builder.UseMssql("Data Source=mssql_test;User ID=sa;Password=1qazxsw23edC;Initial Catalog=LightData_Test;");
            builder.SetCommandOutput(commandOutput);
            var         options = builder.Build();
            DataContext context = new DataContext(options);

            return(context);
        }
Пример #15
0
        public void Options_with_command_timeout()
        {
            var optionsBuilder = new DataContextOptionsBuilder();

            optionsBuilder.UseSqlite("Database=TestDb", o => o.CommandTimeout(45));

            var options = optionsBuilder.Options as SqliteOptions;

            Assert.NotNull(options);
            Assert.Equal(45, options.CommandTimeout);
        }
Пример #16
0
        public DataContext CreateBuilderContextByConnection()
        {
            var builder = new DataContextOptionsBuilder <DataContext>();

            builder.UsePostgre("Server=postgre_test;Port=5432;UserId=postgres;Password=1qazxsw23edC;Database=LightData_Test;");
            builder.SetCommandOutput(commandOutput);
            var         options = builder.Build();
            DataContext context = new DataContext(options);

            return(context);
        }
Пример #17
0
        public DataContext CreateBuilderContextByConnection()
        {
            var builder = new DataContextOptionsBuilder <DataContext>();

            builder.UseMysql("server=mysql_test;Port=3306;User Id=root;password=1qazxsw23edC;database=LightData_Test;Allow Zero Datetime=True;charset=utf8;Min Pool Size=1;Max Pool Size=5;SslMode=None;");
            builder.SetCommandOutput(commandOutput);
            var         options = builder.Build();
            DataContext context = new DataContext(options);

            return(context);
        }
        private static DataContextOptions <TContext> DataContextOptionsFactory <TContext>(
            IServiceProvider applicationServiceProvider,
            Action <DataContextOptionsBuilder <TContext> > optionsAction)
            where TContext : DataContext
        {
            var builder = new DataContextOptionsBuilder <TContext>(
                new DataContextOptions <TContext>());

            optionsAction?.Invoke(builder);

            return(builder.Options);
        }
Пример #19
0
        public void Options_throws_when_null_connection()
        {
            SqliteConnection connection = null;

            var ex = Assert.Throws <ArgumentNullException>(() =>
            {
                var options = new DataContextOptionsBuilder <TestDataContext>().UseSqlite(connection).Options;
            });

            Assert.StartsWith("Value cannot be null.", ex.Message);
            Assert.StartsWith(nameof(connection), ex.ParamName);
        }
Пример #20
0
        public void Options_throws_with_invalid_command_timeout()
        {
            var commandTimeout = -1;

            var ex = Assert.Throws <ArgumentOutOfRangeException>(() =>
            {
                var optionsBuilder = new DataContextOptionsBuilder();
                optionsBuilder.UseSqlite("Database=test.db", o => o.CommandTimeout(commandTimeout));
            });

            Assert.StartsWith(nameof(commandTimeout), ex.ParamName);
        }
Пример #21
0
        public void Options_throws_when_empty_connection_string()
        {
            string connectionString = "";

            var ex = Assert.Throws <ArgumentException>(() =>
            {
                var options = new DataContextOptionsBuilder <TestDataContext>().UseSqlite(connectionString).Options;

                //new TestDbContext( options );
            });

            Assert.StartsWith(Resources.ConnectionStringCannotBeNullOrEmpty, ex.Message);
        }
Пример #22
0
        public async void Queries_CountAsync_Works()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var productCount = await context.Products.CountAsync();

                Assert.Equal(2, productCount);
            }
        }
Пример #23
0
        public async void Queries_FirstAsync_Works()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var plum = await context.Products.FirstAsync(p => p.Name == "Plum");

                Assert.True(plum.Name == "Plum");
            }
        }
Пример #24
0
        public void Create_opens_valid_memory_connection()
        {
            string connectionString = "Data Source=:memory:";

            // FIXME: Why does the generic options fail
            //var options = new DbContextOptionsBuilder<TestDbContext>().UseSqlite( connectionString ).Options;
            var options = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                var result = context.Database.Connection.DbConnection.Database;
                Assert.Equal("main", result);
            }
        }
Пример #25
0
        public async void Queries_SumAsync_Works()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var productCost = await context.Products.SumAsync(p => (decimal)p.Price);

                Assert.True(productCost.Equals(8.0));
            }
        }
Пример #26
0
        public async Task Database_Query_CanReadListAsync()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var products = await context.Products.ToListAsync();

                Assert.Equal(2, products.Count());
                Assert.Equal("Banana", products[0].Name);
                Assert.Equal("Plum", products[1].Name);
            }
        }
Пример #27
0
        public void Database_can_read_with_pk()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var product  = context.Products.First(p => p.Id == 1);
                var product2 = context.Products.First(p => p.Id == 2);

                Assert.Equal("Banana", product.Name);
                Assert.Equal("Plum", product2.Name);
            }
        }
        public void Querying_EagerLoading_CanLoadEntityReference()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                context.Initialize();

                var query = from p in context.Products.FetchOne(p => p.Supplier)
                            select p;

                var products = query.ToList <Product>();

                Assert.True(products[0].Supplier.IsLoaded);
                Assert.Equal("Bananas-R-Us", products[0].Supplier.Value.Name);
            }
        }
        public void DatabaseCreator_CreateIfNotExists_ExistsAndHasTables()
        {
            const string connectionString = "Data Source=:memory:";
            var          options          = new DataContextOptionsBuilder().UseSqlite(connectionString).Options;

            using (var context = new TestDataContext(options))
            {
                var result = context.Database.Connection.DbConnection.Database;
                Assert.Equal("main", result);

                Assert.True(context.Database.Exists());
                Assert.False(context.Database.HasTables());

                var createResult = context.Database.Creator.CreateIfNotExists();
                Assert.True(createResult);
                Assert.True(context.Database.Exists());
                Assert.True(context.Database.HasTables());
            }
        }
        public static IServiceCollection AddDataContext(
            this IServiceCollection serviceCollection,
            Action <DataContextOptionsBuilder> builderAction)
        {
            var optionsBuilder = new DataContextOptionsBuilder();

            builderAction.Invoke(optionsBuilder);

            serviceCollection.AddSingleton(typeof(IDbContextOptionsConfigurator), optionsBuilder.Options.DbContextOptionsConfiguratorType);

            serviceCollection.AddSingleton <IDbContextProvider>(x =>
                                                                new DbContextProvider(
                                                                    optionsBuilder.Options.DbContextType,
                                                                    optionsBuilder.Options.DbContextSettings,
                                                                    x.GetRequiredService <IDbContextOptionsConfigurator>()));

            serviceCollection.AddSingleton(typeof(IDataContext), typeof(DataContext));

            return(serviceCollection);
        }