使用entity frameworkCode-First创建表,运行时

是否可以通过使用EF Code-first在运行时创建表? 我可以使用C#CodeDOM(reflection)在运行时创建我的模型类,但我无法在运行时设置我的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 { AutomaticMigrationsEnabled = true }; var migrator = new DbMigrator(config); migrator.Update(); 

您可以阅读更多相关信息: 使用Code First动态构建模型

更新:如何查询动态表?

 public IEnumerable GetResultsFromTable(string tableName) { using (var context = new MyContext()) { var query = context.ExecuteStoreQuery("SELECT " + "ALL_THOSE_COLUMN_NAMES... " + "FROM " + tableName; return query.ToList(); } } 

有关更多信息,请参阅此内容: 使用动态创建的表中的Entity Framework查询数据

最后对dbContext进行查询,该查询没有任何DbSet <> …

使用这个:

 var x = Db.Set().ToList(); 

如果你的模型类的类型和名称与数据库中相关的名一样,那就完美了。(必须如此)

@Sampath的特殊Tnx