Как создать базу данных из файла .edmx в Entity Framework?

Мне пришлось внезапно переключиться на работу над Code First Entity Framework 4.1. Сначала я ничего не знал об этом фреймворке, но за последние 8 часов мне стало гораздо удобнее читать блоги и статьи.

В частности, этот блог — один из лучших блогов по этой теме, которые я когда-либо видел, но приведенные шаги не соответствуют моему опыту. В частности, мне нужно больше внимания уделить 3-му и 4-му шагам («Создать модель» и «Переключиться на генерацию кода DbContext» соответственно). Я не могу создать базу данных из моего определенного EntitySet. Я получаю SQL и могу его выполнить, но получаю следующую ошибку:

Could not locate entry in sysdatabases for "MyBD" database . No entry found with that name. Make sure that the name is entered correctly entity framework.

Если я снова выполню SQL, я получу ту же ошибку после имен таблиц, которые уже существуют в базе данных.

Если обновить DataConnection в обозревателе сервера, такие таблицы не будут созданы, как я определил в Entity Framework.

Как я могу избавиться от этой ошибки и успешно сгенерировать таблицы в моем .edmx?

Также я не могу найти параметр, щелкнув правой кнопкой мыши в обозревателе решений, чтобы «Создать базу данных» из выбранного файла класса, в котором класс контекста унаследован от объекта DBContext. Я установил Entity framework 4.1 от Microsoft, поэтому он должен появиться там... Как я могу получить опцию Generate Database?


person Red Swan    schedule 26.09.2011    source источник


Ответы (2)


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

  1. Выберите новое подключение
  2. Установите имя сервера: если вы его установили, просто введите . выбрать по умолчанию. Вы также можете попробовать (местный)
  3. Установить новое имя базы данных
  4. Скопируйте сценарий DDL на экран запросов студии управления SQL Server.
  5. Запустите скрипт для создания вашей БД

После запуска скрипта у вас будет исходная таблица. Файл конфигурации будет иметь строку подключения, названную именем контейнера.

Теперь, когда вы хотите переключиться на генерацию кода, как в примере с файлами TT, вы можете щелкнуть правой кнопкой мыши и добавить генерацию кода. Он создаст частичный класс для модели объекта и один файл для dbcontext. Подобно этому:

 using System;
    using System.Collections.Generic;

    public partial class Contact
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

Контекст будет иметь только одну таблицу.

 public partial class PersonModelContainer : DbContext
    {
        public PersonModelContainer()
            : base("name=PersonModelContainer")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Contact> Contacts { get; set; }
    }

Вам не нужна модель ТТ. Вы можете добавить эти файлы напрямую. Вам нужен один класс контекста, наследуемый от DbContext, и один файл частичного класса для каждого типа сущности. Если вы внесете изменения в модель, EF обнаружит это. Вам нужно определить инициализатор Db. Для примера демонстрации на этой веб-странице вы можете добавить инициализатор к другому методу. Если это веб-проект, вы добавляете эту функцию инициализации в Global.asax->application_Start для начальной разработки. У вас есть разные варианты инициализаторов. Я использую drop and create для начальной разработки.

 static void InitDbCheck()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PersonModelContainer>());
            using (var db = new PersonModelContainer())
            {
                //accessing a record will trigger to check db.
                int recordCount = db.Contacts.Count();
            }
        }

        static void Main(string[] args)
        {



            using (var db = new PersonModelContainer())
            {
                // Save some data
                db.Contacts.Add(new Contact { Name = "Bob" });
                db.Contacts.Add(new Contact { Name = "Ted" });
                db.Contacts.Add(new Contact { Name = "Jane" });
                db.SaveChanges();

                // Use LINQ to access data
                var people = from p in db.Contacts
                             orderby p.Name
                             select p;

                Console.WriteLine("All People:");
                foreach (var person in people)
                {
                    Console.WriteLine("- {0}", person.Name);
                }

                // Change someones name
                db.Contacts.First().Name = "Janet";
                db.SaveChanges();
            }
        }
person Omer Cansizoglu    schedule 26.09.2011

Вот исчерпывающее руководство от MSDN по

Как создать базу данных из концептуального Модель (инструменты Entity Data Model) [.edmx].

Скопируйте/вставьте сюда только для полноты картины:

Создание базы данных из концептуальной модели

1. Добавьте в проект файл .edmx.

Сведения о добавлении файла .edmx в проект см. в разделах Практическое руководство. Создание нового файла .edmx (инструменты модели данных объекта) и Практическое руководство. Добавление существующего файла .edmx (инструменты модели данных объекта).

2. Создайте концептуальную модель.

Вы можете использовать конструктор моделей данных сущностей ADO.NET (конструктор сущностей) для создания сущностей и отношений или вручную отредактировать файл .edmx для построения концептуальной модели. Дополнительные сведения см. в разделах Реализация расширенных функций Entity Framework и Спецификации CSDL, SSDL и MSL.

ПримечаниеПримечание При построении концептуальной модели в списке ошибок могут появиться предупреждения о несопоставленных объектах и ​​связях. Вы можете игнорировать эти предупреждения, поскольку мастер создания базы данных добавит модель хранения и информацию о сопоставлении (см. шаг 3).

3. Щелкните правой кнопкой мыши пустое место на поверхности Entity Designer и выберите "Создать базу данных из модели".

Отображается диалоговое окно «Выбор подключения к данным» мастера создания базы данных (инструменты модели данных объекта).

4 – Нажмите кнопку "Новое подключение" или выберите кнопку существующего подключения из раскрывающегося списка, чтобы обеспечить подключение к базе данных.

Вы должны указать подключение к базе данных, чтобы типы столбцов для целевой базы данных можно было определить на основе типов свойств в вашей модели, и чтобы информацию о строке подключения можно было добавить в ваше приложение. Обратите внимание, что предоставление информации о соединении не инициирует генерацию языка определения данных (DDL).

5 — Нажмите "Далее".

Мастер создания базы данных создает язык определения данных для создания базы данных. Сгенерированный DDL отображается в диалоговом окне «Сводка и настройки» (мастер создания базы данных).

6 — Нажмите "Готово".

По завершении мастер создания базы данных делает следующее:

Создает язык определения схемы хранилища (SSDL) и язык спецификации сопоставления (MSL), которые соответствуют предоставленному языку определения концептуальной схемы (CSDL). Файл .edmx обновляется сгенерированными SSDL и MSL. Обратите внимание, что мастер перезаписывает существующие SSDL и MSL.

Сохраняет созданный DDL в местоположении, указанном в текстовом поле Сохранить DDL как. Дополнительные сведения о сгенерированном DDL см. в разделе Правила создания базы данных (мастер создания базы данных).

NoteNote Если модель хранения уже определена при запуске мастера создания базы данных, сгенерированный DDL будет содержать оператор DROP TABLE и оператор DROP CONSTRAINT для каждого EntitySet и каждого AssociationSet (соответственно), которые выводятся из модели хранения.

Добавляет информацию о строке подключения в файл App.config или Web.config.

Важно отметить, что мастер создания базы данных не выполняет сгенерированный DDL. Чтобы создать схему базы данных, соответствующую вашей концептуальной модели, вы должны выполнить сгенерированный DDL независимо (например, выполнить DDL в SQL Server Management Studio).

person Leniel Maccaferri    schedule 29.05.2014
comment
это не создает процедуру хранения. есть ли способ восстановить хранимую процедуру? - person Ubiquitous Developers; 19.12.2019