簡體   English   中英

使用實體框架Code-First創建表,運行時

[英]Create Table, Run Time using entity framework Code-First

是否可以通過使用EF Code-first在運行時創建表? 我可以使用C#CodeDOM(反射)在運行時創建我的模型類,但我無法在運行時設置我的Dbcontext類的dbSet屬性。 你的想法是什么? 什么是在運行時動態創建表的最佳解決方案?...有些人對我說,唯一的方法是使用經典的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();

您可以閱讀更多相關信息: 使用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();
    }
}

有關更多信息,請參閱此內容: 使用動態創建的表中的Entity Framework查詢數據

最后對dbContext進行查詢,該查詢沒有任何DbSet <> ...

使用這個:

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

如果你的模型類的類型和名稱與數據庫中相關的名一樣,那就完美了。(必須如此)

@Sampath的特殊Tnx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM