使用实体框架Code-First创建表,运行时

时间:2016-10-01 13:18:56

标签: c# entity-framework ef-code-first entity-framework-6 ef-migrations

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

2 个答案:

答案 0 :(得分:4)

是的,你可以这样做。

您可以使用“查找类”来执行此操作:

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

现在,您可以为OnModelCreating的{​​{1}}方法添加一些逻辑来扫描程序集,并添加具有context属性的任何类,如下所示。

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

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

更新:如何查询动态表?

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

有关详情,请参阅此处:Querying data using Entity Framework from dynamically created table

答案 1 :(得分:2)

最后对dbContext进行查询,该查询没有任何DbSet&lt;&gt; ...

使用:

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

如果您的模型类的类型和名称与数据库上的相关名称相同,那就完美了。(它必须定)

@Sampath的特殊Tnx