Этот вопрос задавался несколько раз ранее, но я не нашел решения, которое бы мне помогло.
У меня есть две разные базы данных (SQLite
и postgres
) с одинаковыми DbContext
(TranslationContext
).
Я хочу «открыть» обе базы данных и читать / писать друг другу.
Существуют следующие проблемы, в которых мне нужна помощь:
- Как настроить внедрение зависимостей (
StructureMap
) - Как получить различные контексты с помощью
IDbContextScopeFactory
Внедрение зависимостей
Как различить их?Есть ли возможность дать им имя экземпляра, например local
, remote
?
c.For<DbContextOptions<TranslationContext>>().Use(
new DbContextOptionsBuilder<TranslationContext>()
.UseNpgsql(new NpgsqlConnectionStringBuilder
{
Host = "10.11.12.13",
Username = "fooUser",
Password = "fooPw",
Port = 5432,
Database = "Translations",
PersistSecurityInfo = true
}.ConnectionString).Options);
c.For<DbContextOptions<TranslationContext>>().Use(
new DbContextOptionsBuilder<TranslationContext>()
.UseSqlite("Data Source= fooFilePath")
.Options);
, используя IDbContextScopeFactory
Это нормальный способ, которым я 'м, используя IDbContextScopeFactory
.Но до сих пор у меня всегда были разные DbContext
и не было проблем.
using (var scope = contextScopeFactory.Create())
{
var translations = scope.DbContexts.Get<TranslationContext>().Translations;
// How to get the sqlite and how to get the postgres context?
}
TranslationContext
public class TranslationContext : DbContext
{
public DbSet<DbTextTranslation> Translations { get; set; }
public TranslationContext(DbContextOptions<TranslationContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("public");
// use lower case columns
modelBuilder.ApplyConfiguration(new DbTextTranslation.DbConfiguration());
base.OnModelCreating(modelBuilder);
}
}