SQLite单元测试,相同表不同schema无法建表

问题描述 投票:0回答:1

我正在使用 EF DbContext 为我的单元测试创建 SQLite 内存模式,当它创建表时,它会抛出表已存在,即使它们是两个不同的模式,例如 Customer.Order 和 Client.Order

下面的映射文件,我为每个表传递不同的模式名称 - 当我运行迁移到 SQL Server 时它工作正常,但在单元测试时 SQLite 失败

public class CustomerOrderMap: IEntityTypeConfiguration<Order>
{
    private readonly string _schemaName;

    public CustomerOrderMap(string schema = "")
    {
        _schemaName = schema;
    }

    public void Configure(EntityTypeBuilder<Order> builder)
    {
        builder.ToTable($"Order", _schemaName);
    }
}


public void Configure(EntityTypeBuilder<Order> builder)
{
    builder.ToTable($"Order", "Client");
}


public void Configure(EntityTypeBuilder<Order> builder)
{
    builder.ToTable($"Order", "Customer");
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.ApplyConfiguration(new CustomerOrderMap("Customer"));
    modelBuilder.ApplyConfiguration(new ClientOrderMap("Client"));
}

在我的测试课上

_connection = new SqliteConnection("DataSource=:memory:");
_connection.Open();
_contextOptions = new DbContextOptionsBuilder<MyDbContext>()
       .UseSqlite(_connection)
       .Options;
using var context = new MyDbContext(_contextOptions);
if (context.Database.EnsureCreated())
{
}

错误消息 - SQLite 错误 1:“表“Order”已存在”。

请问有什么想法吗?

我尝试将表名称更改为不同的名称,例如 Order1 和 Order2,效果很好,但我需要在 SQLite 中创建表名称相同但架构不同的表以进行测试

c# sqlite unit-testing entity-framework-core xunit
1个回答
0
投票

SQLite 不支持模式。您需要将它们映射到 SQLite 上的不同表名:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // ...

    if (Database.IsSqlite())
    {
        modelBuilder.Entity<Customer.Order>().ToTable("Customer_Order");
        modelBuilder.Entity<Client.Order>().ToTable("Client_Order");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.