Yes you can do it.
You can do this using Class Search:
[AttributeUsage(AttributeTargets.Class)] public class PersistentAttribute : Attribute { }
Now you can add some logic to the OnModelCreating method of your context to test assemblies and add any classes with the [Persist] attribute, as shown below.
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[] { }); } } } }
You can use the code-based data transfer method below, therefore, automatically change the database when new classes or properties are added to the model.
var config = new DbMigrationsConfiguration<MyContext> { AutomaticMigrationsEnabled = true }; var migrator = new DbMigrator(config); migrator.Update();
You can learn more about this: Dynamically building a model with first code
Update: How to query a dynamic table?
public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) { using (var context = new MyContext()) { var query = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT " + "ALL_THOSE_COLUMN_NAMES... " + "FROM " + tableName; return query.ToList(); } }
See this for more: Querying data using the Entity Framework from a dynamically created table
source share