Автоматическое создание таблиц базы данных из объектов, инфраструктуры объектов

Я пытаюсь сделать этот учебник http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/getting-started-with-mvc3-part4-cs, но вместо использования компактной версии SQL Server я использую полную установку на своем локальная машина. То, как я прочитал этот учебник, заключается в том, что Entity Framework предполагает создание таблиц из объектов, которые я определил. Моя проблема в том, что я продолжаю получать недопустимое имя объекта dbo.movies, когда я запускаю проект. Я, наконец, получил его для запуска, создав таблицу самостоятельно, поэтому я знаю строку подключения, и все было правильно.

Мой вопрос: возможно ли генерировать таблицы из объектов, созданных на С#, и если да, то как?

Ответ 1

Можно ли создавать таблицы из объектов, созданных на С#?

Да, это возможно. Вам удалось создать базу данных вручную в Management Studio до запуска кода? Это может быть вашей проблемой. В Code First стандартное соглашение заключается в создании базы данных, если она еще не существует. Если база данных уже существует (даже без таблиц), она будет использовать только существующую базу данных (но она не будет пытаться создавать таблицы).

Вы можете либо удалить базу данных, либо попытаться запустить код еще раз, чтобы узнать, создаст ли он его для вас или поместит следующую строку в Global.asax:

Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContextHere>());

Как только он запустится, я предлагаю изменить эту строку на:

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

Эти пространства имен определены в System.Data.Entity

Класс DbContext также предоставляет свойство базы данных, которое определяет следующие полезные методы:

Delete()
Create()
CreateIfNotExists()

Итак, если вы определили свой класс следующим образом:

public class MyContext : DbContext {}

Вы можете создать такой экземпляр:

MyContext db = new MyContext();
db.Database.Delete();
db.Database.Create();

Ответ 2

Если вы создаете DataContext Linq-to-Sql, вы можете ввести структуру непосредственно в свою базу данных:

DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();

Ответ 3

Я не знаю, является ли это кошерным, но с использованием EF с кодовым кодом, когда я использую AddRange, EF, как правило, создает все таблицы, которые я определил. Я хотел сохранить базу данных, потому что есть другие таблицы, которые я хотел бы сохранить между запусками приложений. Я обнаружил, что таблицы не будут воссозданы после их удаления, если я также не удалю таблицу EF, созданную с именем __MigrationHistory.

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

Это не может быть целесообразным подходом в производстве, но для моих потребностей в развитии это разрешило мою проблему. Может быть, это поможет кому-то другому.

Ответ 4

Вы можете использовать FenixRepo библиотеку (также доступную как пакет nuget), чтобы создать определенную таблицу, которая является частью вас Context. Прежде всего, нужно вызвать один раз при запуске static Initialize, где первый аргумент - это метод factory, который возвращает экземпляр вашего Context, а второй - экземпляр Configuration class. Он подготовит SQL-скрипты для всех ваших таблиц, зарегистрированных на вашем Context. В случае ASP.NET MVC это хорошее решение вставить этот код в Global.asax:

FenixRepositoryScriptExtractor.Initialize(() => new Context(), new Configuration());

Затем вы можете создать таблицу желаемого типа MyTable следующим образом:

var repo = new FenixRepositoryCreateTable<MyTable>();
//or repo = new FenixRepository<MyTable>();

repo.CreateTable();

Кроме того, если ваша таблица распространяется между несколькими миграциями, и у них нет ничего, что соответствует другим таблицам, вы можете указать эти миграции (т.е. имена классов из папки Migrations) через FenixAttribute, и именно они будут использоваться в качестве источника SQL-скрипты, которые будут использоваться для создания таблицы:

[Fenix(nameof(Initial), nameof(MyTableFirstMigration), nameof(MyTableSecondMigration))]
public class MyTable
{
    //some stuff
}

Без этого атрибута библиотека будет использовать скрипты по умолчанию. Всегда лучше указывать миграцию, потому что в противном случае не гарантируется, что все индексы будут созданы, а также в ваши миграции вы можете включить какой-то пользовательский код, который не будет выполнен в случае решения по умолчанию.

Библиотека совместима и протестирована с EF 6.1.3 в случае MS SQL.

Ответ 5

ModelContext.Database.EnsureCreated();