C#EF 4.1在DbContext中动态创建表
我想在运行时将表添加到SQLCe数据库中,因为表名不是静态的,并且在编译时是已知的。 我尝试使用Entity Framework 4.1和DbContext实现这一点,如下所示:C#EF 4.1在DbContext中动态创建表,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,我想在运行时将表添加到SQLCe数据库中,因为表名不是静态的,并且在编译时是已知的。 我尝试使用Entity Framework 4.1和DbContext实现这一点,如下所示: public class PersonContext : DbContext { public PersonContext() : base("UnicornsCEDatabase") { } } public class Person { public int Name
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();
}
}
}
这在EF中是可能的,还是我必须用其他技术来创建它们
谢谢,Juergen您可以使用以下命令,它将创建表或根据需要更新表,但不确定这是否适用于生产环境,因为它会在模型更改时删除数据库
Database.SetInitializer<DataContext>(
new DropCreateDatabaseIfModelChanges<DataContext>());
Database.SetInitializer(
新建DropCreateDatabaseIfModelChanges());
或者,如果您可以创建自己的System.Data.Entity.IDatabaseInitializer实现,则接口实体框架不支持动态创建表。因此,如果您首先使用代码,则必须在DbContext中定义DBSET,以便创建相应的表 像这个问题,还有一些解决办法 但是EF并不是最好的ORM,试试ServiceStack.OrmLite(它是一种轻量级ORM)。
命名空间控制台应用程序31
{
公共类PersonContext:DbContext
{
public PersonContext():base(“UnicornSecDatabase”)
{
}
公共DbSet Persons{get;set;}
}
公共阶层人士
{
公共int PersonId{get;set;}
公共int NameId{get;set;}
公共字符串名称{get;set;}
}
公共课程
{
静态void Main(字符串[]参数)
{
使用(var db=new PersonContext())
{
db.Database.Delete();
//尝试创建表
DbSet per=db.Set();
var per1=newperson{NameId=1,Name=“James”};
每增加(每1);
int recordsAffected=db.SaveChanges();
控制台写入线(
“已将{0}个实体保存到数据库中,请按任意键退出。”,
记录受影响);
Console.ReadKey();
}
}
}
}
现在在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);
}
公共数据库集列表{get;set;}
公共字符串tablename=“list”;
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.ToTable(表名)
.HasKey(s=>s.NameId);
}
Thx,但这并不能解决问题。与此同时,我可以发现,ER团队目前正在研究动态模型。所以我必须耐心重新设计数据库…你解决了这个问题吗?
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();
}
}
}
}
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);
}