C#EF 4.1在DbContext中动态创建表

我想在运行时将表添加到SQLCe数据库,因为表名不是静态的并且在编译时是已知的。 我尝试使用Entity Framework 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(); 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

您可以使用以下,它将创建表或根据需要更新它们,不确定这是否适用于生产,因为它在模型更改时丢弃数据库

  Database.SetInitializer( new DropCreateDatabaseIfModelChanges()); 

或者如果可以创建自己的System.Data.Entity.IDatabaseInitializer接口实现

entity framework不支持动态创建表。 因此,如果您使用的是Code-First,则必须在DbContext中定义DbSet以创建相应的表。

http://entityframework.codeplex.com/discussions/448452

像这个问题有一些解决方法

entity framework(代码优先) – 动态构建模型

但EF不是最好的ORM,试试ServiceStack.OrmLite(它是一个轻量级的ORM)。

 namespace ConsoleApplication31 { public class PersonContext : DbContext { public PersonContext() : base("UnicornsCEDatabase") { } public DbSet 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(); 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(); } } } }