Criar tabela, tempo de execução usando o framework de entidade Code-First

É possível criar tabela em tempo de execução usando o código EF primeiro? Eu poderia criar minha class de modelos em tempo de execução usando C # CodeDOM (reflection), mas eu não poderia definir as propriedades dbSet da minha class Dbcontext em tempo de execução. qual é a sua ideia? Qual é a melhor solução para criar tabela dinamicamente em tempo de execução? … Alguns disseram para mim que a única maneira é usar o ADO.Net clássico.

Sim, você pode fazer isso.

Você pode fazer isso usando Finding the Classes: Finding the Classes: Finding the Classes:

[AttributeUsage(AttributeTargets.Class)] public class PersistentAttribute : Attribute { } 

Agora você pode adicionar alguma lógica ao método OnModelCreating do seu context para verificar assemblies e adicionar classs com o atributo [Persist] como mostrado abaixo.

 public class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { var entityMethod = typeof(DbModelBuilder).GetMethod("Entity"); foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var entityTypes = assembly .GetTypes() .Where(t => t.GetCustomAttributes(typeof(PersistentAttribute), inherit: true) .Any()); foreach (var type in entityTypes) { entityMethod.MakeGenericMethod(type) .Invoke(modelBuilder, new object[] { }); } } } } 

Você pode usar o método de migration de dados baseado em código mencionado abaixo e, portanto, alterar automaticamente o database quando novas classs ou propriedades forem adicionadas ao modelo.

 var config = new DbMigrationsConfiguration { AutomaticMigrationsEnabled = true }; var migrator = new DbMigrator(config); migrator.Update(); 

Você pode ler mais sobre isso: Construindo dinamicamente um modelo com código primeiro

Atualização: Como consultar uma tabela dinâmica?

 public IEnumerable GetResultsFromTable(string tableName) { using (var context = new MyContext()) { var query = context.ExecuteStoreQuery("SELECT " + "ALL_THOSE_COLUMN_NAMES... " + "FROM " + tableName; return query.ToList(); } } 

Veja isto para mais: Consultando dados usando o Entity Framework a partir da tabela criada dinamicamente

finalmente ter uma consulta em um dbContext que não tenha nenhum DbSet <> …

usando isso:

 var x = Db.Set().ToList(); 

está funcionando perfeitamente se o tipo e o nome de suas classs de modelo forem muito parecidos com o nome de suas Tabelas relacionadas no banco de dados (tem que ser)

Tnx especial para @Sampath