2012-03-26 3 views
10

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

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

ответ

19

Возможно ли создание таблиц из объектов, созданных на 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(); 
+0

Хм, что, я полагаю, следует вставить в строку подключения, если для нее нет исходной базы данных? Я просто удаляю из него исходный фрагмент каталога и получаю такое же недопустимое имя объекта «dbo.Movies». – Pieces

+0

Строка подключения сообщает, где создать базу данных. Он не должен существовать. Он обнаружит, что он не существует, а затем попытается создать его, если он этого не сделает. Если у него есть правильные разрешения, все будет создано отлично. Я думаю, что если вы удалите базу данных и сохраните одну и ту же строку соединения, тогда все будет работать так, как вы хотите. – Dismissile

+0

О, огромное спасибо! Последний вопрос, какой метод вы бы порекомендовали помещать в Database.SetInitializer. У меня возникла ошибка, из-за которой он не мог отбросить базу данных, потому что она использовалась. Я бы предположил, что приложение само по себе. Еще раз спасибо, мы с моим другом много времени искали, пытаясь понять проблему, и никогда бы не догадались, что база данных не должна создаваться. – Pieces

0

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

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

Он использует Entity Framework DbContext, а не Linq-to-SQL. – Dismissile

0

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

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

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

0

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

-1
ModelContext.Database.EnsureCreated(); 
+0

PLS объясняет ваш вопрос. –

Смежные вопросы