【问题标题】:Create Table, Run Time using entity framework Code-First使用实体框架 Code-First 创建表,运行时
【发布时间】:2017-02-09 22:50:23
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,你可以这样做。

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

    [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

    更新:如何查询动态表?

    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 时,我怎么能做查询链接???? @山姆
    • 请参阅更新
    • stackoverflow.com/questions/39817703/… ...这个怎么样? @Sampath
    • 希望这也能奏效。然后你可以接受这两种解决方案:D
    • 是的,对不起,我必须按下那个绿色标志 :)...我只是 stackoverflow 中的新人:D
    【解决方案2】:

    终于在没有任何 DbSet 的 dbContext 上进行查询...

    使用这个:

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

    如果您的 model classes 的类型和名称与 database 上的相关 Tables 名称非常相似,那么它会完美运行。(它必须是)

    @Sampath 的特殊 Tnx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多