C#EF 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

我想在运行时将表添加到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<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);
}