Использование одного DBContext с моделью для нескольких схем, созданных во время выполнения в EF Core.C#

Место общения программистов C#
Ответить
Anonymous
 Использование одного DBContext с моделью для нескольких схем, созданных во время выполнения в EF Core.

Сообщение Anonymous »

Рассмотрим пример приложения со структурой данных:
Calculations: Id, Value

Приложение должно обновить структуру базы данных во время выполнения, чтобы добавить новую таблицу, распознаваемую схемой. Затем следует добавить в эту таблицу данные расчета. Наконец, он должен читать данные в соответствии со схемой.
Пример таблиц, созданных во время выполнения с именами схем a, b, c и т. д.:
a.Calculations
b.Calculations
c.Calculations
etc.

Как лучше всего использовать в ядре EF один контекст базы данных и один класс модели без использования наследования?
Модель:
public class Calculation
{
public int? Id;
public int? Value;
}

Контекст БД, который получает схему в качестве аргумента. Он также использует ModelCacheKeyFactory для возврата кэшированной модели в соответствии со схемой:
public partial class SampleDBContext : DbContext
{
public string Schema { get; }
public DbSet Calculations { get; set; }

public SampleDBContext(DbContextOptions options, string schema)
: base(options)
{
Schema = schema;
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity().ToTable("Calculations", Schema);
}

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
if (!optionsBuilder.IsConfigured)
optionsBuilder
.UseSqlServer("Data Source=localhost; Initial Catalog=SampleDB;")
.ReplaceService();
}
}

Генерация данных: сначала необходимо обновить структуру базы данных, что здесь является проблемой.
public void Generate(string schema)
{
// Updating the database structure is missing here!
// ...
//
var optionBuilder = new DbContextOptionsBuilder();
var context = new SampleDBContext(optionBuilder.Options, schema);
var calculation = new Calculation { Value = 1 };
context.Calculations.Add(calculation);
context.SaveChanges();
}

Загрузка данных:
public List Load(string schema)
{
var optionBuilder = new DbContextOptionsBuilder();
var context = new SampleDBContext(optionBuilder.Options, schema);
var data = context.Calculations.ToList();
return data;
}

Использование:
Genarate("a");
var resultsA = Load("a");
Genarate("b");
var resultsB = Load("b");
Genarate("c");
var resultsC = Load("c");


Подробнее здесь: https://stackoverflow.com/questions/792 ... -runtime-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»