EF Core SQLite в памяти исключение: ошибка SQLite 1: «рядом с« MAX »: синтаксическая ошибка» - PullRequest
0 голосов
/ 30 ноября 2018

Я создаю базу данных SQLite In Memory для модульного тестирования:

        var connection = new SqliteConnection("DataSource=:memory:");
        connection.Open();

        try
        {
            var options = new DbContextOptionsBuilder<BloggingContext>()
                .UseSqlite(connection)
                .Options;

            // Create the schema in the database
            using (var context = new BloggingContext(options))
            {
                context.Database.EnsureCreated();
            }

            // Run the test against one instance of the context
            using (var context = new BloggingContext(options))
            {
                var service = new BlogService(context);
                service.Add("http://sample.com");
            }

            // Use a separate instance of the context to verify correct data was saved to database
            using (var context = new BloggingContext(options))
            {
                Assert.AreEqual(1, context.Blogs.Count());
                Assert.AreEqual("http://sample.com", context.Blogs.Single().Url);
            }
        }

context.Database.EnsureCreated (); завершается неудачно с исключением: Сообщение: Microsoft.Data.Sqlite.SqliteException: ошибка SQLite 1: «рядом с« MAX »: синтаксическая ошибка».

Существует проблема github , говорящая: Проблема здесь varchar (max) является специфическим типом SqlServer.Леса не должны добавлять его как реляционный тип, который передается для миграции в других провайдерах, которые склонны генерировать недопустимые sql при миграции.

Но как тогда я могу использовать SQLite в памяти для модуляпроверяет, содержит ли моя база данных много столбцов varchar (max)?

1 Ответ

0 голосов
/ 30 декабря 2018

Я не нашел прямого решения, но начал использовать обходной путь для файлов конфигурации.Вы не указали, используете ли вы EF Configurations, поэтому извините основы, если они не нужны.

В вашем DbContext поместите следующее:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfigurationsFromAssembly(typeof(ChildrensSsiContext).Assembly);
}

Теперь создайте статический класс, как показано ниже.Он собирается забрать вашу собственность и обработать конфигурацию.

internal static class ConfigurationHelper
{
    internal static void ConfigureVarcharMax(PropertyBuilder<string> propertyBuilder, bool isRequired = true)
    {
        propertyBuilder
            .IsRequired(isRequired)
            //.HasColumnType("varchar(max)");
            .HasColumnType("text");
    }
}

Создайте класс конфигурации для каждой сущности, которую вы хотите настроить

public class MyEntityWithVarcharMaxConfiguration
    : IEntityTypeConfiguration<MyEntityWithVarcharMax>
{
    public void Configure(EntityTypeBuilder<MyEntityWithVarcharMax> builder)
    {
        ConfigurationHelper.ConfigureVarcharMax(builder.Property(e => e.MyVarcharMaxProperty));
    }
}

Оставьте HasColumnType ("text") незакомментированным для тестирования.Затем закомментируйте эту строку и раскомментируйте HasColumnType ("varchar (max)") при добавлении миграции.

Это боль, которую нужно помнить, чтобы сделать это, но это довольно простой обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...