Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create Table, Run Time using entity framework Code-First

Is that possible to create table in run time by using EF Code-first? i could create my models class in run time by using C# CodeDOM(reflection) but i couldn't set the dbSet properties of my Dbcontext class in run time. whats your idea? whats the best solution to create table dynamically in run time?... some ones said to my that the only way is using classic ADO.Net.

like image 536
Iman Salehi Avatar asked Oct 01 '16 13:10

Iman Salehi


People also ask

How do I create a SQL table using code first approach?

Step 1: Primarily add new Project/website in Visual Studio and create User Defined type/class. Step 2: Add some properties which will be the columns in Table, namespace EntityFrameworkCodeFirst. {


2 Answers

Yes,you can do that.

You can do that using Finding the Classes :

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

Now you can add some logic to the OnModelCreating method of your context to scan 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 below mentioned code based data migration method hence 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 read more about this : Dynamically Building A Model With Code First

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 Entity Framework from dynamically created table

like image 193
Sampath Avatar answered Oct 27 '22 18:10

Sampath


finally to have a query on a dbContext which doesn't have any DbSet<>...

using this:

var x = Db.Set<YourModelType>().ToList();

it's perfectly working if type and name of your model classes be much as like their related Tables name on database.(it has to be)

special Tnx for @Sampath

like image 33
Iman Salehi Avatar answered Oct 27 '22 17:10

Iman Salehi