![](/img/trans.png)
[英]Cannot Create Database with credentials using Entity Framework 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
{
}
现在,您可以向context
的OnModelCreating
方法添加一些逻辑,以扫描程序集并添加具有[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.