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

问题描述 投票:5回答:4

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

[尝试运行此命令时将引发此错误:实体类型Person不是当前上下文模型的一部分

是否有可能在运行时将DbSet添加到DbContext without,而必须在数据库中定义该DbSet(及其模式)?

[当用Person静态定义DbContext时,EF将动态创建整个数据库和表,这很棒。

例如:

foreach (var item in collection)
{
   string tableName = "PersonTable_"+item.Name;
   //Add a table with the name tableName to DbContext
}

EF可以通过某种方式实现,还是必须通过其他技术来创建?

谢谢,于尔根

c# entity-framework dbcontext
4个回答
2
投票

您可以使用以下命令,它将创建表或根据需要更新它们,不确定是否可以在生产环境中使用,因为在模型更改时它将删除数据库

 Database.SetInitializer<DataContext>(
                new DropCreateDatabaseIfModelChanges<DataContext>());

或者是否可以创建您自己的System.Data.Entity.IDatabaseInitializer接口的实现


1
投票

实体框架不支持动态创建表。因此,如果您使用的是Code-First,则必须在DbContext中定义DbSet才能创建相应的表。

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

有一些类似此问题的解决方法

Entity Framework (Code First) - Dynamically Building a Model

但是EF并不是最好的ORM,请尝试ServiceStack.OrmLite(它是轻量级的ORM。)>


0
投票
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();
                }
            }
        }

}

0
投票

现在进入EF8,您可以那样做:

© www.soinside.com 2019 - 2024. All rights reserved.