Как в EF добавить таблицу?

290
27 октября 2017, 10:30

Есть проэкт, понадобилось добавить в него таблицу. Всё бы хорошо, только таблица не появляется в базе после того как делаю drop database, ну и понятно получаю exception. (добавил да, таблица не появляется когда запускаю проэкт, я считал что удаление СУБД заставит её создать, для этого удаляю субд) База МуSQL. Теперь по подробнее... В папку Entities\DataBase добавил таблицу

namespace MyProj.Domain.Entities.Database{
  public class Company{
    [Key]
    public int Id { get; set; }
    [MaxLength(255)]
    public String Name { get; set; }
}}

Идём дальше. В документации написано смотреть Entities\Migrations\Configuration.cs, смотрю...

internal sealed class Configuration : DbMigrationsConfiguration<MyProj.Domain.Concrete.MysqlEfDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        CodeGenerator = new MyCodeGenerator();
    }

Зашёл в MysqlEfDbContext

[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class MysqlEfDbContext : DbContext
{
   public DbSet<Company> Companies { get; set; } // Дописал сюда таблицу, 
   // тут аналогично находятся другие таблицы
   public DbSet<User> Users { get; set; }
}

Да, класс MyCodeGenerator - не содержит ссылок на таблицы. Не стал его публиковать.Там перехват метода Generate и вызов StripDbo, особенного не увидел.

До изменений - создавалась база, таблицы и всё работало. После изменений, создалась база без новой таблицы, и исключение

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration.

Ладно, раз пишут true - пусть, ставим AutomaticMigrationsEnabled = true;. Тогда получаю другую ошибку

Table 'concreteperiods' already exists.

(это имя самой первой таблицы, которую нужно создать). Таблица companies, теперь создалась. Ошибка и первая и вторая появляется тут:

var user = (_repository.Users != null)?_repository.Users.
   ToList().FirstOrDefault(x => x.Username.Equals(model.UserName) 
 && x.Password.Equals(model.Password)) : null;

Смотрю что такое _repository

namespace MyProj.WebUI.Controllers
{
public class AccountController : Controller
{
    private IProductRepository _repository;
    readonly IAuthProvider _authProvider;
    public AccountController(IAuthProvider auth, IProductRepository repo)
    {
        _repository = repo;
        _authProvider = auth;
    }

На AccountController ссылок нет.

Почитал про миграцию. Теперь история с миграцией.
Сделал в консоли Enable-Migrations. Студия нулячая - получил ошибку - незнаю команду. Сделал правой мыши на проект -> восстановить пакеты. Enable-Migrations

PM> Enable-Migrations
Code First Migrations enabled for project MyProj.Domain.
PM> Add-Migration "company"
The project 'MyProj.Domain' failed to build.

Смотрю на проэкт - у меня создалась в корень ещё одна папка Mirgations, и в ней ещё один файл Configuration.cs - и как результат - проэкт не собирается т.к класс Configuration обьявле два раза. Удалил, повторил Add-Migration "company" получаю ошибку веселее...

PM> Add-Migration "company" System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта. в MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection connection) в System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) в MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection connection) в ... System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run() в System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) в System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate) в System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner) в System.Data.Entity.Migrations.Design.ToolingFacade.Scaffold(String migrationName, String language, String rootNamespace, Boolean ignoreChanges) в System.Data.Entity.Migrations.AddMigrationCommand.Execute(String name, Boolean force, Boolean ignoreChanges) в System.Data.Entity.Migrations.AddMigrationCommand.<>c__DisplayClass2.<.ctor>b__0() в System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)

EntityFramework версия 6.0.0.0, среда выполнения v 4.0.30319

VS 2017

Что ещё можно посмотреть, есть ли где ещё список таблиц, которые нужно создать при "первом запуске"?

Answer 1

После добавления новой таблицы вы должны создать миграцию.

Вводим в консоль диспетчера пакетов (Pkgmgr.exe):

  • Enable-Migrations - включение миграций.

  • Add-Migration "Название" - добавление новой миграции.

  • Update-Database - обновление DB.

UPDATED: или вы можете создать свой инициализатор, унаследовать его от DropCreateDatabaseAlways<T> и пересоздавать базу при каждом запуске (при этом теряются данные).

READ ALSO
Отображение списочных данных в WinForms

Отображение списочных данных в WinForms

С С# я знаком относительно недавно, всегда занимался веб-программированием

219
Изменение кодировки текста в PDF файле

Изменение кодировки текста в PDF файле

Есть текстовые файлы с PCL разметкой, их необходимо перекодировать в PDFЕдинственная некоммерческая программа которую я нашел - ghostpcl, при...

196
Ошибка в асинхронном запросе

Ошибка в асинхронном запросе

Пытаюсь получить текущего работающего пользователя, через WMIНо происходит не понятная мне ошибка

202
Заполнение SubReport из List

Заполнение SubReport из List

Необходимо вывести из данные из List в таблицу, которая находится во вложенном отчетеОднако при привязки List к DataSource вложенного отчета , выводится...

221