Пример #1
0
        public void Does_non_key_SQL_Server_fixed_length_binary_mapping()
        {
            var property = CreateEntityType().AddProperty("MyBinaryProp", typeof(byte[]));

            property.Relational().ColumnType = "binary(100)";

            var typeMapping = new SqlServerTypeMapper().GetMapping(property);

            Assert.Equal(DbType.Binary, typeMapping.DbType);
            Assert.Equal("binary(100)", typeMapping.StoreType);
        }
Пример #2
0
        public void Does_not_do_rowversion_mapping_for_non_computed_concurrency_tokens()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(byte[]));

            property.IsConcurrencyToken = true;

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.Binary, typeMapping.DbType);
            Assert.Equal("varbinary(max)", typeMapping.StoreType);
        }
Пример #3
0
        private static IReadOnlyList <MigrationOperation> Process(
            MigrationOperationCollection operations, IModel sourceModel, IModel targetModel = null)
        {
            var extensionProvider  = new SqlServerMetadataExtensionProvider();
            var typeMapper         = new SqlServerTypeMapper();
            var operationFactory   = new SqlServerMigrationOperationFactory(extensionProvider);
            var operationProcessor = new SqlServerMigrationOperationProcessor(
                extensionProvider, typeMapper, operationFactory);

            return(operationProcessor.Process(operations, sourceModel, targetModel ?? new Model()));
        }
Пример #4
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public static ConventionSet Build()
        {
            var sqlServerTypeMapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            return(new SqlServerConventionSetBuilder(
                       new RelationalConventionSetBuilderDependencies(sqlServerTypeMapper, null, null),
                       new SqlServerSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))
                   .AddConventions(
                       new CoreConventionSetBuilder(
                           new CoreConventionSetBuilderDependencies(sqlServerTypeMapper))
                       .CreateConventionSet()));
        }
Пример #5
0
        private static IReadOnlyList <MigrationOperation> Diff(IModel sourceModel, IModel targetModel)
        {
            var extensionProvider  = new SqlServerMetadataExtensionProvider();
            var typeMapper         = new SqlServerTypeMapper();
            var operationFactory   = new SqlServerMigrationOperationFactory(extensionProvider);
            var operationProcessor = new SqlServerMigrationOperationProcessor(
                extensionProvider, typeMapper, operationFactory);
            var modelDiffer = new SqlServerModelDiffer(
                extensionProvider, typeMapper, operationFactory, operationProcessor);

            return(modelDiffer.Diff(sourceModel, targetModel));
        }
Пример #6
0
        public void Binary_key_with_max_length_is_picked_up_by_FK()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "varbinary(100)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType2)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "varbinary(100)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType3)).FindProperty("Relationship1Id")).StoreType);
        }
Пример #7
0
        public void Does_key_SQL_Server_binary_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(byte[]));

            property.IsNullable = false;
            property.DeclaringEntityType.SetPrimaryKey(property);

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.Binary, typeMapping.DbType);
            Assert.Equal("varbinary(900)", typeMapping.StoreType);
            Assert.Equal(900, typeMapping.CreateParameter(new TestCommand(), "Name", new byte[3]).Size);
        }
Пример #8
0
        public void String_FK_max_length_is_preferred_if_specified()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper();

            Assert.Equal(
                "nvarchar(200)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType1)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "nvarchar(787)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType2)).FindProperty("Relationship2Id")).StoreType);
        }
        public void Does_indexed_column_SQL_Server_string_mapping()
        {
            var entityType = CreateEntityType();
            var property   = entityType.AddProperty("MyProp", typeof(string));

            entityType.AddIndex(property);

            var typeMapping = new SqlServerTypeMapper().GetMapping(property);

            Assert.Null(typeMapping.StoreType);
            Assert.Equal("nvarchar(450)", typeMapping.DefaultTypeName);
            Assert.Equal(4000, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #10
0
        public void String_key_with_unicode_is_picked_up_by_FK()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "varchar(900)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType3)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "varchar(900)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType4)).FindProperty("Relationship1Id")).StoreType);
        }
Пример #11
0
        public void Key_store_type_if_preferred_if_specified()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "money",
                mapper.FindMapping(model.FindEntityType(typeof(MyType)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "dec",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType1)).FindProperty("Relationship2Id")).StoreType);
        }
Пример #12
0
        public void Binary_FK_max_length_is_preferred_if_specified()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "varbinary(100)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType2)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "varbinary(767)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType3)).FindProperty("Relationship2Id")).StoreType);
        }
Пример #13
0
        public void Key_with_store_type_is_picked_up_by_FK()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "money",
                mapper.FindMapping(model.FindEntityType(typeof(MyType)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "money",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType1)).FindProperty("Relationship1Id")).StoreType);
        }
Пример #14
0
        public void String_key_with_max_length_is_picked_up_by_FK()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper();

            Assert.Equal(
                "nvarchar(200)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType1)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "nvarchar(200)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType2)).FindProperty("Relationship1Id")).StoreType);
        }
        public void Does_key_SQL_Server_string_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(string));

            property.IsNullable = false;
            property.DeclaringEntityType.SetPrimaryKey(property);

            var typeMapping = new SqlServerTypeMapper().GetMapping(property);

            Assert.Null(typeMapping.StoreType);
            Assert.Equal("nvarchar(450)", typeMapping.DefaultTypeName);
            Assert.Equal(4000, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #16
0
        public void String_FK_unicode_is_preferred_if_specified()
        {
            var model  = CreateModel();
            var mapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            Assert.Equal(
                "varchar(900)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType3)).FindProperty("Id")).StoreType);

            Assert.Equal(
                "nvarchar(450)",
                mapper.FindMapping(model.FindEntityType(typeof(MyRelatedType4)).FindProperty("Relationship2Id")).StoreType);
        }
Пример #17
0
        public void Does_key_SQL_Server_binary_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(byte[]), shadowProperty: true);

            property.DeclaringEntityType.SetPrimaryKey(property);
            property.IsNullable = false;

            var typeMapping = new SqlServerTypeMapper().MapPropertyType(property);

            Assert.Equal(DbType.Binary, typeMapping.StoreType);
            Assert.Equal("varbinary(900)", typeMapping.DefaultTypeName);
            Assert.Equal(8000, typeMapping.CreateParameter(new TestCommand(), "Name", new byte[3]).Size);
        }
Пример #18
0
        public void Does_indexed_column_SQL_Server_binary_mapping()
        {
            var entityType = CreateEntityType();
            var property   = entityType.AddProperty("MyProp", typeof(byte[]));

            entityType.AddIndex(property);

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.Binary, typeMapping.DbType);
            Assert.Equal("varbinary(900)", typeMapping.StoreType);
            Assert.Equal(900, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #19
0
        public void Does_foreign_key_SQL_Server_string_mapping()
        {
            var property   = CreateEntityType().AddProperty("MyProp", typeof(string), shadowProperty: true);
            var fkProperty = property.DeclaringEntityType.AddProperty("FK", typeof(string), shadowProperty: true);
            var pk         = property.DeclaringEntityType.SetPrimaryKey(property);

            property.DeclaringEntityType.AddForeignKey(fkProperty, pk, property.DeclaringEntityType);

            var typeMapping = new SqlServerTypeMapper().MapPropertyType(fkProperty);

            Assert.Null(typeMapping.StoreType);
            Assert.Equal("nvarchar(450)", typeMapping.DefaultTypeName);
            Assert.Equal(4000, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #20
0
        public void Does_foreign_key_SQL_Server_binary_mapping()
        {
            var property   = CreateEntityType().AddProperty("MyProp", typeof(byte[]));
            var fkProperty = property.DeclaringEntityType.AddProperty("FK", typeof(byte[]));
            var pk         = property.DeclaringEntityType.SetPrimaryKey(property);

            property.DeclaringEntityType.AddForeignKey(fkProperty, pk, property.DeclaringEntityType);

            var typeMapping = new SqlServerTypeMapper().GetMapping(fkProperty);

            Assert.Equal(DbType.Binary, typeMapping.StoreType);
            Assert.Equal("varbinary(900)", typeMapping.DefaultTypeName);
            Assert.Equal(8000, typeMapping.CreateParameter(new TestCommand(), "Name", new byte[3]).Size);
        }
Пример #21
0
        public void Does_non_key_SQL_Server_rowversion_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(byte[]));

            property.IsConcurrencyToken = true;
            property.ValueGenerated     = ValueGenerated.OnAddOrUpdate;

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.Binary, typeMapping.DbType);
            Assert.Equal("rowversion", typeMapping.StoreType);
            Assert.Equal(8, typeMapping.Size);
            Assert.Equal(8, typeMapping.CreateParameter(new TestCommand(), "Name", new byte[8]).Size);
        }
Пример #22
0
        public void Does_indexed_column_SQL_Server_string_mapping_ansi()
        {
            var entityType = CreateEntityType();
            var property   = entityType.AddProperty("MyProp", typeof(string));

            property.IsUnicode(false);
            entityType.AddIndex(property);

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.AnsiString, typeMapping.DbType);
            Assert.Equal("varchar(900)", typeMapping.StoreType);
            Assert.Equal(900, typeMapping.Size);
            Assert.False(typeMapping.IsUnicode);
            Assert.Equal(900, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #23
0
        public void Does_key_SQL_Server_string_mapping_ansi()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(string));

            property.IsNullable = false;
            property.IsUnicode(false);
            property.DeclaringEntityType.SetPrimaryKey(property);

            var typeMapping = new SqlServerTypeMapper(new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Equal(DbType.AnsiString, typeMapping.DbType);
            Assert.Equal("varchar(900)", typeMapping.StoreType);
            Assert.Equal(900, typeMapping.Size);
            Assert.False(typeMapping.IsUnicode);
            Assert.Equal(900, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #24
0
        public void Does_foreign_key_SQL_Server_string_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(string));

            property.IsNullable = false;
            var fkProperty = property.DeclaringEntityType.AddProperty("FK", typeof(string));
            var pk         = property.DeclaringEntityType.SetPrimaryKey(property);

            property.DeclaringEntityType.AddForeignKey(fkProperty, pk, property.DeclaringEntityType);

            var typeMapping = new SqlServerTypeMapper().GetMapping(fkProperty);

            Assert.Null(typeMapping.DbType);
            Assert.Equal("nvarchar(450)", typeMapping.StoreType);
            Assert.Equal(450, typeMapping.Size);
            Assert.True(typeMapping.IsUnicode);
            Assert.Equal(450, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
Пример #25
0
        public void Does_indexed_column_SQL_Server_string_mapping(bool?unicode)
        {
            var entityType = CreateEntityType();
            var property   = entityType.AddProperty("MyProp", typeof(string));

            property.IsUnicode(unicode);
            entityType.AddIndex(property);

            var typeMapping = new SqlServerTypeMapper(
                new CoreTypeMapperDependencies(),
                new RelationalTypeMapperDependencies()).GetMapping(property);

            Assert.Null(typeMapping.DbType);
            Assert.Equal("nvarchar(450)", typeMapping.StoreType);
            Assert.Equal(450, typeMapping.Size);
            Assert.True(typeMapping.IsUnicode);
            Assert.Equal(450, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public static ConventionSet Build()
        {
            var sqlServerTypeMapper = new SqlServerTypeMapper(
                new CoreTypeMapperDependencies(
                    new ValueConverterSelector(
                        new ValueConverterSelectorDependencies())),
                new RelationalTypeMapperDependencies());

            return(new SqlServerConventionSetBuilder(
                       new RelationalConventionSetBuilderDependencies(sqlServerTypeMapper, null, null),
                       new SqlServerSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))
                   .AddConventions(
                       new CoreConventionSetBuilder(
                           new CoreConventionSetBuilderDependencies(
                               sqlServerTypeMapper,
                               new ConstructorBindingFactory()))
                       .CreateConventionSet()));
        }
        private static IHistoryRepository CreateHistoryRepository(string schema = null)
        {
            var annotationsProvider = new SqlServerAnnotationProvider();
            var sqlGenerator        = new SqlServerSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies());
            var typeMapper          = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            var commandBuilderFactory = new RelationalCommandBuilderFactory(
                new FakeSensitiveDataLogger <RelationalCommandBuilderFactory>(),
                new DiagnosticListener("Fake"),
                typeMapper);

            return(new SqlServerHistoryRepository(
                       new HistoryRepositoryDependencies(
                           Mock.Of <IRelationalDatabaseCreator>(),
                           Mock.Of <IRawSqlCommandBuilder>(),
                           Mock.Of <ISqlServerConnection>(),
                           new DbContextOptions <DbContext>(
                               new Dictionary <Type, IDbContextOptionsExtension>
            {
                {
                    typeof(SqlServerOptionsExtension),
                    new SqlServerOptionsExtension {
                        MigrationsHistoryTableSchema = schema
                    }
                }
            }),
                           new MigrationsModelDiffer(
                               new SqlServerTypeMapper(new RelationalTypeMapperDependencies()),
                               annotationsProvider,
                               new SqlServerMigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies())),
                           new SqlServerMigrationsSqlGenerator(
                               new MigrationsSqlGeneratorDependencies(
                                   commandBuilderFactory,
                                   new SqlServerSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()),
                                   typeMapper,
                                   annotationsProvider),
                               new SqlServerMigrationsAnnotationProvider(new MigrationsAnnotationProviderDependencies())),
                           annotationsProvider,
                           sqlGenerator)));
        }
Пример #28
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        public static ConventionSet Build()
        {
            var coreTypeMapperDependencies = new CoreTypeMapperDependencies(
                new ValueConverterSelector(
                    new ValueConverterSelectorDependencies()));

            var sqlServerTypeMapper = new SqlServerTypeMapper(
                new RelationalTypeMapperDependencies());

            var convertingTypeMapper = new FallbackRelationalCoreTypeMapper(
                coreTypeMapperDependencies,
                new RelationalTypeMapperDependencies(),
                sqlServerTypeMapper);

            return(new SqlServerConventionSetBuilder(
                       new RelationalConventionSetBuilderDependencies(convertingTypeMapper, null, null, null),
                       new SqlServerSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))
                   .AddConventions(
                       new CoreConventionSetBuilder(
                           new CoreConventionSetBuilderDependencies(convertingTypeMapper, null, null))
                       .CreateConventionSet()));
        }
        public static void Generate(this DbContext @context, Union <StringBuilder, StreamWriter> writer)
        {
            var sqlMapper = new SqlServerTypeMapper(new RelationalTypeMapperDependencies());

            var entries = context.ChangeTracker.Entries();

            var addedEntities = (from ent in entries
                                 where ent.State == EntityState.Added
                                 select ent);

            var updatedEntities = (from ent in entries
                                   where ent.State == EntityState.Modified
                                   select ent);

            var deletedEntities = (from ent in entries
                                   where ent.State == EntityState.Deleted
                                   select ent);

            GenerateInserts(writer, context, addedEntities, sqlMapper);
            GenerateUpdates(writer, context, updatedEntities, sqlMapper);
            GenerateDeletes(writer, context, deletedEntities, sqlMapper);
        }
        private static void GenerateInserts(Union <StringBuilder, StreamWriter> sBuilder, DbContext context, IEnumerable <EntityEntry> entries, SqlServerTypeMapper mapper)
        {
            foreach (var entry in entries)
            {
                var tableName    = GetTableName(entry.Entity.GetType(), context);
                var lastProperty = entry.Properties.Last();
                sBuilder.Append("EXECUTE sp_executesql N'INSERT INTO ");
                sBuilder.Append(tableName);
                sBuilder.Append(" ");
                sBuilder.Append("(");

                //We'll need this list later to add only the necesary parameters in order
                var handledProperties = GetPropertiesToHandle(entry);

                foreach (var prop in entry.Properties)
                {
                    //Skip identity columnns and other generated values
                    if (prop.Metadata.ValueGenerated == Microsoft.EntityFrameworkCore.Metadata.ValueGenerated.OnAdd)
                    {
                        continue;
                    }
                    GenerateColumnName(sBuilder, prop);
                    sBuilder.Append((prop.Metadata.Name != lastProperty.Metadata.Name) ? ", ": "");
                    handledProperties.Add(prop);
                }

                sBuilder.Append(") VALUES (");

                var handledPropertyCount = handledProperties.Count();

                for (var i = 0; i < handledPropertyCount; i++)
                {
                    var prop = handledProperties[i];
                    sBuilder.Append(GenerateParameterName(i));

                    sBuilder.Append((i != (handledPropertyCount - 1)) ? "," : "");
                }
                sBuilder.Append(")'");

                //Generate Parameters
                sBuilder.Append(", N'");
                GenerateParameters(sBuilder, handledProperties, handledPropertyCount);

                sBuilder.Append(";");
            }
        }
        public void Does_non_key_SQL_Server_byteArray_mapping()
        {
            var typeMapping = new SqlServerTypeMapper()
                .GetTypeMapping(null, "MyColumn", typeof(byte[]), isKey: false, isConcurrencyToken: false);

            Assert.Equal(DbType.Binary, typeMapping.StoreType);
            Assert.Equal("varbinary(max)", typeMapping.StoreTypeName);
        }
        public void Does_non_key_SQL_Server_string_mapping()
        {
            var typeMapping = new SqlServerTypeMapper()
                .GetTypeMapping(null, "MyColumn", typeof(string), isKey: false, isConcurrencyToken: false);

            Assert.Equal(DbType.String, typeMapping.StoreType);
            Assert.Equal("nvarchar(max)", typeMapping.StoreTypeName);
        }
        public void Does_required_foreign_key_SQL_Server_string_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(string), shadowProperty: true);
            var fkProperty = property.DeclaringEntityType.AddProperty("FK", typeof(string), shadowProperty: true);
            var pk = property.DeclaringEntityType.SetPrimaryKey(property);
            property.DeclaringEntityType.AddForeignKey(fkProperty, pk, property.DeclaringEntityType);
            fkProperty.IsNullable = false;

            var typeMapping = new SqlServerTypeMapper().MapPropertyType(fkProperty);

            Assert.Null(typeMapping.StoreType);
            Assert.Equal("nvarchar(450)", typeMapping.DefaultTypeName);
            Assert.Equal(4000, typeMapping.CreateParameter(new TestCommand(), "Name", "Value").Size);
        }
        public void Does_required_foreign_key_SQL_Server_binary_mapping()
        {
            var property = CreateEntityType().AddProperty("MyProp", typeof(byte[]), shadowProperty: true);
            var fkProperty = property.DeclaringEntityType.AddProperty("FK", typeof(byte[]), shadowProperty: true);
            var pk = property.DeclaringEntityType.SetPrimaryKey(property);
            property.DeclaringEntityType.AddForeignKey(fkProperty, pk, property.DeclaringEntityType);
            fkProperty.IsNullable = false;

            var typeMapping = new SqlServerTypeMapper().MapPropertyType(fkProperty);

            Assert.Equal(DbType.Binary, typeMapping.StoreType);
            Assert.Equal("varbinary(900)", typeMapping.DefaultTypeName);
            Assert.Equal(8000, typeMapping.CreateParameter(new TestCommand(), "Name", new byte[3]).Size);
        }