Как я могу создать базу данных из файла .edmx в Entity Framework? - PullRequest
7 голосов
/ 26 сентября 2011

Мне пришлось внезапно переключиться на работу над 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?

Ответы [ 2 ]

22 голосов
/ 30 мая 2014

Вот полное руководство MSDN по

Как создать базу данных из концептуальной модели (инструменты модели данных сущностей) [.edmx] файл.

Копирование / вставка здесь только для полноты:

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

1 - добавьте файл EDMX в свой проект.

Сведения о добавлении файла EDMX в проект см. В разделе Как создать новый файл EDM (инструменты модели данных Entity) и Как добавить существующий файл EDMX (инструменты модели данных Entity).).

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

Вы можете использовать ADO.NET Entity Data Model Designer (Entity Designer) для создания сущностей и отношений, или вы можетевручную отредактируйте файл .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 см. Правила создания базы данных (Мастер создания базы данных).

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

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

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

6 голосов
/ 26 сентября 2011

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

  1. Выберите новое соединение
  2. Установите имя сервера: если вы установили его, просто введите.выбрать по умолчанию.Вы также можете попробовать (локально)
  3. Установить новое имя базы данных
  4. Скопировать сценарий DDL на экран запросов вашей студии управления SQL-сервером
  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; }
    }

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

 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();
            }
        }
...