gpt4 book ai didi

c# - 内存中的 EF Core SQLite 异常 : SQLite Error 1: 'near "MAX": syntax error'

转载 作者:行者123 更新时间:2023-12-03 17:31:21 25 4
gpt4 key购买 nike

我正在为单元测试创​​建 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 issue说:
这里的问题是 varchar(max) 是 SqlServer 特定的类型。脚手架不应将其添加为在其他提供程序中传递给迁移的关系类型,这在迁移时容易生成无效的 sql。

但是,如果我的数据库包含许多 varchar(max) 列,那么如何在内存中使用 SQLite 进行单元测试?

最佳答案

我没有找到直接的解决方案,但已开始使用配置文件解决方法。您没有说明您是否使用 EF 配置,因此如果不需要,请原谅基础知识。

在您的 DbContext 中放置以下内容:

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

现在创建一个如下所示的静态类。它将占用您的属性(property)并处理配置。
internal static class ConfigurationHelper
{
internal static void ConfigureVarcharMax(PropertyBuilder<string> propertyBuilder, bool isRequired = true)
{
propertyBuilder
.IsRequired(isRequired)
//.HasColumnType("varchar(max)");
.HasColumnType("text");
}
}

为要配置的每个实体创建一个 Configuration 类
public class MyEntityWithVarcharMaxConfiguration
: IEntityTypeConfiguration<MyEntityWithVarcharMax>
{
public void Configure(EntityTypeBuilder<MyEntityWithVarcharMax> builder)
{
ConfigurationHelper.ConfigureVarcharMax(builder.Property(e => e.MyVarcharMaxProperty));
}
}

不注释 HasColumnType("text") 以进行测试。然后在添加迁移时注释该行并取消注释 HasColumnType("varchar(max)")。

您需要记住这样做很痛苦,但这是一个相当简单的解决方法。

关于c# - 内存中的 EF Core SQLite 异常 : SQLite Error 1: 'near "MAX": syntax error',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com