使用 entity framework 代码优先创建 Table、运行 时间

Create Table, Run Time using entity framework Code-First

是否可以通过使用 EF 代码优先在 运行 时间内创建 table? 我可以使用 C# CodeDOM(反射)在 运行 时间内创建我的模型 class,但我无法设置 dbSet 属性Dbcontext class 在 运行 时间。 你的想法是什么? 在 运行 时间内动态创建 table 的最佳解决方案是什么?... 有些人对我说,唯一的方法是使用 classic ADO.Net

是的,你可以做到。

您可以使用查找 类 来做到这一点:

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

现在您可以向 contextOnModelCreating 方法添加一些逻辑来扫描程序集并添加具有 [Persist] 属性的任何 类,如下所示。

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[] { });
      }
    }
  }
}

您可以使用下面提到的基于代码的数据迁移方法,因此当新 类 或属性添加到模型时自动更改数据库。

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

您可以阅读更多相关信息:Dynamically Building A Model With Code First

更新:如何查询动态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();
    }
}

查看更多信息:Querying data using Entity Framework from dynamically created table

最终对没有任何 DbSet<> 的 dbContext 进行查询...

使用这个:

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

如果您的 模型 类 的类型和名称与其相关的 Tables 名称在 数据库.(必须是)

@Sampath 的特殊 Tnx