我正在编写一个实用程序来更新 .NET 6.0 中我们每个环境中的设置,使用 Blazor Wasm (这在这里真的不重要......)。
我有三个数据库,代表 3 个不同的环境(它在 3 个地方是同一个数据库)。
我配置我的上下文如下
var devConnectionString = builder.Configuration.GetConnectionString("DevelopmentServer");
var qaConnectionString = builder.Configuration.GetConnectionString("QAServer");
var prodConnectionString = builder.Configuration.GetConnectionString("ProdServer");
builder.Services.AddDbContext<DockDevContext>(options => options.UseSqlServer(devConnectionString));
builder.Services.AddDbContext<DockQaContext>(options => options.UseSqlServer(qaConnectionString));
builder.Services.AddDbContext<DockProdContext>(options => options.UseSqlServer(prodConnectionString));
我的服务看起来像:
public PricingRepository(
DockDevContext dockDevContext,
DockQaContext dockQaContext,
DockProdContext dockProdContext,
IOptions<CosmosOptions> options)
{
_dockDevContext = dockDevContext;
_dockQaContext = dockQaContext;
_dockProdContext = dockProdContext;
_options = options.Value;
}
忽略宇宙选项...
我的数据库上下文都看起来像:
public class DockDevContext : BaseContext
{
public DockDevContext(DbContextOptions<DockDevContext> options)
: base(options)
{
}
}
并且所有 3 都继承自 basecontext:
public class BaseContext : DbContext
{
public DbSet<UserMapping>? UserMappings { get; set; }
public BaseContext(DbContextOptions options ):base(options)
{
}
}
我的更新例程如下所示:
private void AddCustomerNumberMapping<TContext>(
TContext context,
MsaPricing msaPricing,
bool isProd = false)
where TContext : BaseContext
{
var mapping = new UserMapping
{
UserId = isProd ? ProdUserId : NonProdUserId,
CustomerNumber = long.Parse(msaPricing.CustomerNumber)
};
var existingMapping = context.UserMappings?
.Where(map => mapping.UserId == map.UserId &&
mapping.CustomerNumber == map.CustomerNumber);
context.UserMappings?.Add(mapping);
context.SaveChanges();
}
当我第一次使用 contextA 运行它时,它可以工作当我使用上下文 B 运行它时,它失败了,说它已被处理。