VS Database Project продолжает пропускать таблицу - PullRequest
1 голос
/ 25 октября 2019

У меня есть проект базы данных Visual Studio (2019), который пропускает создание таблицы независимо от того, что я делаю, и я не могу понять, почему.

Фон:

Я создал проект, импортировав его из базы данных SQL в Azure с существующей структурой таблиц. База данных была в значительной степени прототипом, и я потянул ее, чтобы ускорить создание «настоящей» базы данных.

Затем я модифицировал почти все таблицы в проекте, применяя некоторые стандартные соглашения об именах, индексы,и т. д. Я добавил исходные файлы данных как часть Post Deployment и т. д.

Затем, чтобы подготовиться к тесту чистой установки базы данных и тестовых данных, я отбрасываю все в базу данных SQL Server.

То, что я пробовал:

Сначала я попытался опубликовать проект базы данных в моей новой пустой базе данных. Я «Создать сценарий», выполнить сценарий (из VS) только, чтобы обнаружить, что он пытается добавить индекс в таблицу, которая не существует. Клянусь, таблица Предметов есть ... и, конечно же, она есть в Проекте. Он тоже собирается строить. Но, глядя на сценарий развертывания, у него нет таблицы Item.

То, что я попробовал дальше:

Перемотка вперед к моей следующей попытке, игнорируя часы обновлений VS, сборки, перестройки, очистки, перезапуска и т. Д. Я перехожу насравнивая схему из моего проекта с пустой базой данных, я знаю, что она сгенерирует все мои операторы create, но не включит мои файлы после развертывания. (Я решил, что смогу запустить их позже). Сравнение с пустой базой данных выглядит так, как и следовало ожидать (ничего, кроме пробелов в правой части экрана сравнения схем). Я генерирую скрипт обновления и смотрю «Предварительный просмотр» (отрывок ниже), и моя таблица элементов там:

** Highlights
     Tables that will be rebuilt
       None
     Clustered indexes that will be dropped
       None
     Clustered indexes that will be created
       None
     Possible data issues
       None

** User actions
     Create
       [db_executor] (Role)
       [dbo].[ApiKey] (Table)
       [dbo].[AppLog] (Table)
       [dbo].[AppLog].[IX_AppLog_SessionId] (Index)
       [dbo].[Customer] (Table)
       [dbo].[Customer].[IX_Customer_ExternalId] (Index)
       [dbo].[Customer].[IX_Customer_OrganizationId] (Index)
       [dbo].[Customer].[UX_Customer_Name] (Index)
       [dbo].[CustomerDepartment] (Table)
       [dbo].[CustomerDepartment].[IX_CustomerDepartment_DepartmentId] (Index)
       [dbo].[CustomerSetting] (Table)
       [dbo].[CustomerSetting].[IX_CustomerSetting_SettingId] (Index)
       [dbo].[Department] (Table)
       [dbo].[Department].[IX_Department_ExternalId] (Index)
       [dbo].[Department].[UX_Department_Code] (Index)
       [dbo].[ImageResource] (Table)
       [dbo].[Item] (Table)
       [dbo].[Item].[IX_Item_UPC] (Index)
       <snip>

Далее я смотрю на сгенерированный сценарий SQL и обнаруживаю, что моя таблица элементов снова опущена,с индексом Item, появляющимся сразу после таблицы ImageResource, создайте:

PRINT N'Creating [dbo].[ImageResource]...';


GO
CREATE TABLE [dbo].[ImageResource] (
    [ImageResourceId] INT             IDENTITY (1, 1) NOT NULL,
    [URL]             NVARCHAR (2048) NULL,
    [ContentType]     NVARCHAR (128)  NOT NULL,
    [Width]           INT             NULL,
    [Height]          INT             NULL,
    [IsActive]        BIT             NOT NULL,
    [Created]         DATETIME2 (7)   NOT NULL,
    [CreatedBy]       NVARCHAR (128)  NOT NULL,
    [Modified]        DATETIME2 (7)   NULL,
    [ModifiedBy]      NVARCHAR (128)  NULL,
    CONSTRAINT [PK_ImageResource] PRIMARY KEY CLUSTERED ([ImageResourceId] ASC)
);


GO
PRINT N'Creating [dbo].[Item].[IX_Item_UPC]...';


GO
CREATE NONCLUSTERED INDEX [IX_Item_UPC]
    ON [dbo].[Item]([UPC] ASC);

Есть предложения?

EDIT1:

Чтобы добавить дополнительную информациюЯ вижу в выходном скрипте, что есть несколько ALTERS, которые указывают на мои «пропущенные» таблицы. Таким образом, VS ясно считает, что таблица существует в целевой БД. Поскольку это не так, я предполагаю, что метаданные целевой базы данных должны где-то храниться / кэшироваться и что они устарели. Я удалил папки obj и bin. Кто-нибудь знает, если / где могут быть метаданные этой кешированной целевой БД?

EDIT2:

Так запутанно, если я нажму «Опубликовать» вместо «Создать сценарий», чтобы волшебным образомразверните базу данных, в которой действительно работает публикация, создав все таблицы. Но что еще более странно, это то, что ProjectName.publish.sql, который генерируется как часть публикации, похож на тот, который создается, когда вы выбираете «Создать сценарий», поскольку в нем отсутствует 5 из 25 таблиц. ,Таким образом, команды SQL, которые выполняются скрытно во время публикации, , а не , совпадают с ProjectName.publish.sql, который выводится.

К сожалению, мне нужен файл SQL публикации, чтобы датьчтобы администратор баз данных работал «по-настоящему», я могу выполнить только прямое развертывание VS в моей базе данных dev.

...