AppDbContextFactory.cs
3.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;
using Npgsql;
using Rcs.Domain.Settings;
namespace Rcs.Infrastructure.DB.MsSql
{
public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
{
public AppDbContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>();
var currentDir = Directory.GetCurrentDirectory();
var possiblePaths = new List<string>
{
currentDir,
Path.Combine(currentDir, "src", "Rcs.Api"),
Path.Combine(currentDir, "Rcs.Api"),
Path.Combine(currentDir, "..", "Rcs.Api"),
Path.Combine(currentDir, "..", "..", "Rcs.Api"),
Path.Combine(currentDir, "src", "HaH.RCS.WebApi"),
Path.Combine(currentDir, "HaH.RCS.WebApi"),
Path.Combine(currentDir, "..", "HaH.RCS.WebApi"),
Path.Combine(currentDir, "..", "..", "HaH.RCS.WebApi"),
Path.Combine(currentDir, "..", "..", "..", "HaH.RCS.WebApi"),
Path.Combine(currentDir, "..", "..", "..", "..", "HaH.RCS.WebApi")
};
var fullPaths = possiblePaths
.Select(Path.GetFullPath)
.Where(path => !possiblePaths.Contains(path))
.ToList();
possiblePaths.AddRange(fullPaths);
string? configPath = null;
foreach (var path in possiblePaths.Distinct())
{
try
{
var appsettingsPath = Path.Combine(path, "appsettings.json");
if (File.Exists(appsettingsPath))
{
configPath = path;
break;
}
}
catch
{
continue;
}
}
if (configPath == null)
{
throw new InvalidOperationException(
$"无法找到 appsettings.json 文件。已尝试以下路径:\n{string.Join("\n", possiblePaths)}");
}
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";
var configuration = new ConfigurationBuilder()
.SetBasePath(configPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false)
.AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: false)
.Build();
var appSettings = configuration.GetSection(nameof(AppSettings)).Get<AppSettings>();
var connectionString = appSettings?.ConnSql.ConnectionString;
if (string.IsNullOrWhiteSpace(connectionString))
{
throw new InvalidOperationException("无法从 AppSettings.ConnSql.ConnectionString 读取数据库连接字符串。");
}
// 创建 NpgsqlDataSource 并启用动态 JSON 序列化
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString);
dataSourceBuilder.UseNetTopologySuite();
dataSourceBuilder.EnableDynamicJson();
var dataSource = dataSourceBuilder.Build();
optionsBuilder.UseNpgsql(dataSource, o => o.UseNetTopologySuite());
return new AppDbContext(optionsBuilder.Options);
}
}
}