1

Я создал приложение MVC, в котором я переименовал класс модели из «Diplomata» в «Diplomas», и теперь я не могу сделать миграции для создания таблицы с именем «Diplomas», потому что они все еще используют старое имя для некоторая причина. (С использованием .NET Framework 4.6 и EntityFramework 6.1.2)Почему мое приложение ищет таблицу, которая не должна/не должна существовать?

вещи, которые я пытался до сих пор:

  • сбрасывают таблиц БД полностью (из SQL Object Server Explorer Visual Studio и вручную удалить файлы)
  • удалить папку миграции и повторное включение миграцию
  • удаление модели и воссоздание его (после удаления миграции и полностью сбросив столы)

После включения миграции снова и с помощью команды «добавить перенастройки Начальные» Я получаю сценарий, который генерирует таблицу с именем «dbo.Diplomata»

это модель

namespace DDS.Data.Models 
{ 
    using System.Collections.Generic; 
    using DDS.Data.Common.Models; 

    public class Diploma : BaseModel<int> 
    { 
     public string Title { get; set; } 

     public string Description { get; set; } 

     public virtual ICollection<Tag> Tags { get; set; } 
    } 
} 

это ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
    } 
    ... 
    public IDbSet<Diploma> Diplomas { get; set; } 
    ... 
} 

и это часть миграции скрипт, который автоматически генерируется

public partial class Initial : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.Diplomata", 
      c => new 
      { 
       Id = c.Int(nullable: false, identity: true), 
       Title = c.String(), 
       Description = c.String(), 
    ... 
} 

Также поиск в VS2015 для «Diplomata» во всем решении ничего не нашел.

Добавление миграции, которая переименовывает таблицу, приводит к сбою приложения после обновления, поскольку он ищет таблицу со старым именем. (Недопустимое имя объекта 'dbo.Diplomata')

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

PS: Это мой первый вопрос здесь, так что, если я что-то пропустил или что-то трудно понять, пожалуйста, скажите мне, спасибо

+0

Нет свободного кода (OnModelCreating)? Вы можете попробовать изменить свой инициализатор на DropCreateDatabaseAlways и посмотреть, создает ли это правильные таблицы. Все остальное выглядит правильно. –

+0

DropCreateDatabaseAlways не помогло. Я заметил, что когда я пытаюсь переименовать таблицу с переносом в консоли диспетчера пакетов после выполнения обновления базы данных, я получаю это предупреждение: _Caution: изменение любой части имени объекта может привести к поломке скриптов и хранимых процедур ._Witch говорит мне, что там могут быть некоторые скрипты, которые мне нужно избавиться от @SteveGreene –

ответ

0

Вы почистите таблицу Миграции? Когда миграция включена, генерируется системная таблица с именем «__MigrationHistory». Вы можете найти такую ​​таблицу из SQL Server Management Studio. Перейдите в «YourDatabase-> Таблицы-> Системные таблицы, и он будет там.

Способа миграция работа выглядит следующим образом:

  1. Первоначальная миграция генерируются с указанным именем.
  2. Начальная миграция выполнена.
  3. Когда начальная миграция и последующие миграции выполняются, изменения применяются к базе данных и моментальный снимок структуры базы данных, которую он сохранил в таблице __MigrationHIstory, в качестве новой строки.
  4. Когда приложение инициализируется, EF сравнивает последнюю запись в таблице миграции и сравнивает этот моментальный снимок с последней доступной миграцией, если они не совпадают, будет выбрано исключение. Именно так EF определяет, изменилась ли база данных.

Когда вы вносите изменения в исходную модель, вы должны создавать последующие файлы миграции, чтобы вы могли вернуть или применить изменения базы данных. Если вы уже удалили исходный файл миграции, вероятно, лучшим вариантом будет очистка таблицы __MigrationHistory. EF генерирует уникальные записи в таблице (я считаю, что поведение по умолчанию - это имя файла миграции + отметка времени при создании миграции). Вы всегда можете переименовать исходный файл миграции в соответствии с именем в таблице __MigrationHistory и создать новую миграцию для применения переименования рассматриваемой таблицы. Это будет работать, только если имена файлов и модели совпадают снимки в БД, в противном случае будет сгенерировано исключение

Посмотрите на эту статью для получения дополнительной информации о миграции: http://tech.trailmax.info/2014/03/inside_of_ef_migrations/

В стороне обратите внимание, что вы также можете изменить поведение по умолчанию, как создается таблица истории переноса. Это может быть полезно в случае, если вам необходимо поддерживать определенные потребности, такие как переименование, а не генерировать его в виде системной таблицы, добавлять дополнительные столбцы и т. Д. Это будет полезно в определенных сценариях. Проверьте следующую ссылку (особенно полезно для облачных баз данных на основе): How do I add an additional column to the __MigrationHistory table?

ПРИМЕЧАНИЕ: Важно отметить, что таблицы, которые не содержатся в исходной модели или последующих моделей будут исключены из проверки модели. Это особенно полезно, если вы хотите создавать таблицы, которые не должны контролироваться EF. I.E: Таблицы поставщика членства.

Надеюсь, это поможет прояснить проблемы, которые у вас возникают.

+0

Спасибо за ваше время :) Это небольшой проект, и мне не нужны данные в таблицах, которые нужно сохранить, поэтому я удалил все таблицы, в том числе одну миграцию Проблема с переименованием таблицы в новую миграцию такова: Недопустимое имя объекта 'dbo.Diplomata' Он пытается использовать старое имя, которое я нахожу странным, потому что оно не является жестко закодированным в любом месте проекта –

0

После нескольких испытаний и ошибок я отказался от решения проблемы. Вместо этого я заставил приложение создать модель в таблице с именем, которое я хотел, добавив атрибут Table в модель. Итак, теперь модель выглядит следующим образом:

[Table("Diplomas")] 
public class Diploma : BaseModel<int> 
{ 
    public string Title { get; set; } 

    public string Description { get; set; } 

    public virtual ICollection<Tag> Tags { get; set; } 
} 
Смежные вопросы