C # EF 4.1 Динамически создавать таблицы в DbContext - PullRequest
4 голосов
/ 15 ноября 2011

Я хочу добавить таблицы в базу данных 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 (со своей схемой) в базе данных?

КогдаОпределяя DbContext статически с Person, EF создаст всю базу данных и таблицы на лету, и это здорово.

Например:

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

Возможно ли это с помощью EF или сделатьЯ должен создать их с другой техникой?

Спасибо, Юрген

Ответы [ 3 ]

1 голос
/ 24 ноября 2013

Entity Framework не поддерживает динамическое создание таблиц.Поэтому, если вы используете Code-First, вам нужно определить свои DbSets в вашем DbContext для создания соответствующих таблиц.

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

Есть некоторые обходные пути, подобные этому вопросу

Entity Framework (сначала код) - динамическое построение модели

Но EF не лучший ORM для этого, попробуйте ServiceStack.OrmLite (это легкий ORM).

1 голос
/ 15 ноября 2011

вы можете использовать следующее: он будет создавать таблицы или обновлять их по мере необходимости, не будучи уверенным, будет ли это работать в производственном процессе, так как он понижает дБ при изменении модели

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

или, если вы можете создать собственную реализацию интерфейса System.Data.Entity.IDatabaseInitializer

0 голосов
/ 27 марта 2014
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();
                }
            }
        }

}
...