如何使用 ASP.NET Core 和 EF Core 在运行时创建新的 SQLite 数据库?

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

我有一个大型 SQL Server 数据库。想象一下该数据库接收和发送数据的设备。

为了让设备在离线场景下继续工作,我想为每个设备创建唯一的 SQLite 数据库。当我向相关端点发送请求时,我希望基于我从头开始指定的

DbContext
对象创建一个新的 SQLite 数据库。

此数据库应填充主数据库中仅特定于该设备的数据。请求完成后,我想返回这个数据库,然后我想从后端目录中删除为这个实例创建的名为

deneme.db
的文件。

换句话说,每次发出请求都会创建一个新的数据库文件。这些数据库将特定于设备,并且这些设备的数量将来可能会增加。因此,不会有固定的数据库。

我想使用 ASP.NET Core 和 Entity Framework Core 来执行这些操作,但我找不到任何资源。你能帮忙吗?

c# sqlite asp.net-core entity-framework-core
1个回答
0
投票

为了达到您的要求,您可以尝试以下代码:

服务:

public class SQLiteDbService
{
    private readonly YourMainDbContext _mainDbContext;
    
    public SQLiteDbService(YourMainDbContext mainDbContext)
    {
        _mainDbContext = mainDbContext;
    }
    
    public async Task<string> CreateAndPopulateSQLiteDb(string deviceId)
    {
        var sqliteConnectionString = $"Data Source={deviceId}.db";
        var options = new DbContextOptionsBuilder<YourSQLiteDbContext>()
            .UseSqlite(sqliteConnectionString)
            .Options;

        await using var sqliteDbContext = new YourSQLiteDbContext(options);
        await sqliteDbContext.Database.EnsureCreatedAsync();
        
        var deviceData = _mainDbContext.Devices
            .Where(d => d.DeviceId == deviceId)
            .Include(/* include related data as necessary */)
            .FirstOrDefault();
        
        if (deviceData == null) throw new Exception("Device not found");
        
        sqliteDbContext.Devices.Add(deviceData);
        await sqliteDbContext.SaveChangesAsync();
        
        return sqliteConnectionString;
    }
    
    public async Task DeleteSQLiteDbFile(string connectionString)
    {
        var dbFilePath = new SqliteConnectionStringBuilder(connectionString).DataSource;
        if (File.Exists(dbFilePath))
        {
            File.Delete(dbFilePath);
        }
    }
}

控制器:

[ApiController]
[Route("api/[controller]")]
public class DeviceController : ControllerBase
{
    private readonly SQLiteDbService _sqliteDbService;

    public DeviceController(SQLiteDbService sqliteDbService)
    {
        _sqliteDbService = sqliteDbService;
    }

    [HttpGet("getDeviceData/{deviceId}")]
    public async Task<IActionResult> GetDeviceData(string deviceId)
    {
        try
        {
            var sqliteConnectionString = await _sqliteDbService.CreateAndPopulateSQLiteDb(deviceId);
            
            var dbFilePath = new SqliteConnectionStringBuilder(sqliteConnectionString).DataSource;
            var dbFileBytes = await System.IO.File.ReadAllBytesAsync(dbFilePath);
            var fileResult = new FileContentResult(dbFileBytes, "application/octet-stream")
            {
                FileDownloadName = "demofile.db"
            };

            await _sqliteDbService.DeleteSQLiteDbFile(sqliteConnectionString);

            return fileResult;
        }
        catch (Exception ex)
        {
            return StatusCode(500, ex.Message);
        }
    }
}

启动.cs:

public void ConfigureServices(IServiceCollection services)
{
    .......
    services.AddDbContext<YourMainDbContext>(options => options.UseSqlServer("connection string"));
    services.AddScoped<SQLiteDbService>();
}
© www.soinside.com 2019 - 2024. All rights reserved.