使用 entity framework 代码优先创建 Table、运行 时间
Create Table, Run Time using entity framework Code-First
是否可以通过使用 EF 代码优先在 运行 时间内创建 table?
我可以使用 C# CodeDOM(反射)在 运行 时间内创建我的模型 class,但我无法设置 的 dbSet 属性Dbcontext class 在 运行 时间。
你的想法是什么?
在 运行 时间内动态创建 table 的最佳解决方案是什么?...
有些人对我说,唯一的方法是使用 classic 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();
您可以阅读更多相关信息:Dynamically Building A Model With Code First
更新:如何查询动态Table?
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 进行查询...
使用这个:
var x = Db.Set<YourModelType>().ToList();
如果您的 模型 类 的类型和名称与其相关的 Tables 名称在 数据库.(必须是)
@Sampath 的特殊 Tnx
是否可以通过使用 EF 代码优先在 运行 时间内创建 table? 我可以使用 C# CodeDOM(反射)在 运行 时间内创建我的模型 class,但我无法设置 的 dbSet 属性Dbcontext class 在 运行 时间。 你的想法是什么? 在 运行 时间内动态创建 table 的最佳解决方案是什么?... 有些人对我说,唯一的方法是使用 classic 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();
您可以阅读更多相关信息:Dynamically Building A Model With Code First
更新:如何查询动态Table?
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 进行查询...
使用这个:
var x = Db.Set<YourModelType>().ToList();
如果您的 模型 类 的类型和名称与其相关的 Tables 名称在 数据库.(必须是)
@Sampath 的特殊 Tnx