5

我想在运行时将表添加到 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而无需在数据库中定义该 DbSet(及其模式)?

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

例如:

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

这是否可以通过 EF 以某种方式实现,或者我是否必须使用其他技术来创建这些?

谢谢,于尔根

4

4 回答 4

2

您可以使用以下,它会根据需要创建表或更新它们,不确定这是否会在生产中工作,因为它会在模型​​更改时删除数据库

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

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

于 2011-11-15T15:56:14.990 回答
2

现在在 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://docs.microsoft.com/zh-cn/ef/core/modeling/entity-types?tabs=fluent-api

于 2020-02-04T08:01:42.250 回答
1

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

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

有一些解决方法,比如这个问题

实体框架(代码优先) - 动态构建模型

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

于 2013-11-24T17:34:58.090 回答
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();
                }
            }
        }

}
于 2014-03-27T06:54:42.297 回答