Я не проверял это, но я думаю вы можете сделать это путем реализации пользовательских соглашений - если вы используете EF6 по крайней мере.
Сначалавам нужно создать пользовательское соглашение:
public class CustomTableNameConvention : IStoreModelConvention<EntitySet>
{
private readonly string _tablePrefix;
public CustomTableNameConvention(string tablePrefix)
{
_tablePrefix = tablePrefix;
}
public void Apply(EntitySet item, DbModel model)
{
//change table name.
item.Table = $"{_tablePrefix}" + item.Table;
}
}
Далее вам нужно добавить это соглашение в метод OnModelCreating
вашего контекста:
public class MyContext : DbContext
{
public MyContext(string connectionString) : base(connectionstring)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//get the dynamic table prefix...
var myAppPrefix = "user1";
modelBuilder.Conventions.Add(new CustomTableNameConvention(myAppPrefix));
base.OnModelCreating(modelBuilder);
}
public DbSet<SomeModel> { get; set; }
...
}
... Затем,всякий раз, когда модель в этом экземпляре приложения запускается, она должна проходить через вышеуказанное при принятии решения о том, какими должны быть имена таблиц.Просто замените код myAppPrefix = ...
на вызов соответствующей службы, чтобы получить префикс для этого экземпляра.
очевидное предостережение: вы не можете использовать значение для префикса, которое возвращается из базы данных (по крайней мере, не через этот контекст), поскольку контекст еще не инициализирован, поэтому вам придется либо сохранить его в настройках, либо передать его другим способом.
Надеюсь, это поможет.