Автоматическое создание таблиц базы данных из объектов, Entity Framework - PullRequest
12 голосов
/ 26 марта 2012

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

У меня вопрос: возможно ли создавать таблицы из объектов, созданных в C #, и если да, то как?

Ответы [ 5 ]

23 голосов
/ 26 марта 2012

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

Да, это возможно. Случалось ли вам создавать базу данных вручную в 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();
1 голос
/ 06 января 2018
ModelContext.Database.EnsureCreated();
0 голосов
/ 19 апреля 2017

Вы можете использовать библиотеку FenixRepo (также доступна как пакет nuget ) для создания определенной таблицы, которая является частью вас Context. Прежде всего, вам следует вызвать один раз при запуске static Initialize метод, где первый аргумент - это фабричный метод, который возвращает экземпляр вашего 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
}

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

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

0 голосов
/ 09 февраля 2016

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

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

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

0 голосов
/ 26 марта 2012

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

DbDataContext db = new DbDataContext(connectionString);
db.CreateDatabase();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...