c# EF 4.1在DbContext中动态创建表
本文关键字:动态 创建 DbContext EF | 更新日期: 2023-09-27 18:14:35
我想在运行时向SQLCe数据库添加表,因为表名不是静态的,并且在编译时是已知的。我尝试这样做与实体框架4.1和DbContext如下:
public class PersonContext : DbContext
{
public PersonContext()
: base("UnicornsCEDatabase")
{
}
}
public class Person
{
public int NameId { get; set; }
public string Name { get; set; }
}
public class Program
{
static void Main(string[] args)
{
using (var db = new PersonContext())
{
db.Database.Delete();
//Try to create table
DbSet per = db.Set<Person>();
var per1 = new Person { NameId = 1, Name = "James"};
per.Add(per1);
int recordsAffected = db.SaveChanges();
Console.WriteLine(
"Saved {0} entities to the database, press any key to exit.",
recordsAffected);
Console.ReadKey();
}
}
}
当尝试运行这个时,它会抛出以下错误:实体类型Person不是当前上下文模型的一部分。
是否有可能在运行时将DbSet添加到DbContext 而无需在数据库中定义DbSet(及其模式)?
当用Person静态地定义DbContext时,EF将动态地创建整个数据库和表,这非常棒。
例如:foreach (var item in collection)
{
string tableName = "PersonTable_"+item.Name;
//Add a table with the name tableName to DbContext
}
这在某种程度上是可能的与EF或我必须创建这些与一些其他技术?
谢谢,Juergen
您可以使用以下方法,它将根据需要创建表或更新表,不确定这是否会在生产中工作,因为当模型更改时它会删除db
Database.SetInitializer<DataContext>(
new DropCreateDatabaseIfModelChanges<DataContext>());
或者可以创建自己的System.Data.Entity.IDatabaseInitializer接口
现在在EF8中,你可以这样做:
public DbSet<Person> List { get; set; }
public string tablename = "list";
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.ToTable(tablename)
.HasKey(s => s.NameId);
}
https://learn.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=fluent-api 实体框架不支持动态创建表。因此,如果你使用Code-First,你必须在DbContext中定义dbset,以便创建相应的表。
http://entityframework.codeplex.com/discussions/448452有一些解决方法,比如这个问题
实体框架(代码优先)-动态构建模型
但是EF不是最好的ORM,试试ServiceStack吧。OrmLite(它是一个轻量级的ORM)。namespace ConsoleApplication31
{
public class PersonContext : DbContext
{
public PersonContext() : base("UnicornsCEDatabase")
{
}
public DbSet<Person> Persons { get; set; }
}
public class Person
{
public int PersonId { get; set; }
public int NameId { get; set; }
public string Name { get; set; }
}
public class Program
{
static void Main(string[] args)
{
using (var db = new PersonContext())
{
db.Database.Delete();
//Try to create table
DbSet per = db.Set<Person>();
var per1 = new Person { NameId = 1, Name = "James" };
per.Add(per1);
int recordsAffected = db.SaveChanges();
Console.WriteLine(
"Saved {0} entities to the database, press any key to exit.",
recordsAffected);
Console.ReadKey();
}
}
}
}