Внешний ключ сценариев sql, сгенерированных visual studio, отличается

У меня есть два класса Entity:

public class User 
{
    public string Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    [InverseProperty("User")]
    public virtual UserDetail UserDetail { get; set; }
}

public class UserDetail
{
    public string Biography { get; set; }

    [Key]
    public string UserId { get; set; }
    [ForeignKey("UserId")]
    public virtual User User { get; set; }
}

И DbContext:

public class AppDbContext : DbContext
{
    public AppDbContext (DbContextOptions<AppDbContext> options)
        : base(options)
    {
    }

    public DbSet<User> Users { get; set; }
    public DbSet<UserDetail> UserDetails { get; set; }
}

Когда я запускаю команду:

dotnet ef migrations add Initial

dotnet ef database update

Будут созданы две таблицы. Когда я дважды щелкаю dbo.UserDetails в «Обозревателе объектов SQL Server» Visual Studio, в представлении «Дизайн» отображается внешний ключ:

Foreign Key in Design View

Однако, если щелкнуть правой кнопкой мыши «dbo.UserDetails» и выбрать «Сценарий как» -> «Создать в» -> «Новое окно запроса», сгенерированный sql будет:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[UserDetails] (
    [Biography] NVARCHAR (MAX) NULL,
    [UserId]    NVARCHAR (450) NOT NULL
);

Что меня смущает, так это то, что FK CONSTRAINT исчез.

  • Visual Studio: сообщество 2017, 15.7.5
  • Пакет SDK для .NET Core: 2.1.302
  • Ядро Entity Framework: 2.1.1-rtm-30846

Любая помощь? Заранее спасибо .

Ограничение может быть включено в сценарий определения таблицы CREATE, но формально оно не является частью таблицы. Он создает отдельный объект, связанный с таблицей. Очевидно, действие сценария по умолчанию не включает ограничений FK. В Management Studio есть отдельные задачи «Создание сценариев», в которых вы можете настроить, включать ли ограничения и индексы; Я не уверен, есть ли что-то подобное в VS Object Explorer. (Я почти уверен, что Management Studio не пропустит ключ начальный при написании сценария, и вы заметите, что даже этого нет!)

Jeroen Mostert 13.09.2018 20:17

Я только что попробовал это в VS2017 15.8.3, и внешние ключи и индексы написаны по сценарию. Как было предложено @JeroenMostert, в Management Studio есть параметры для сценариев по умолчанию, хотя я не смог найти их в VS

mheptinstall 13.09.2018 20:18

У меня тоже эта проблема, я не могу добавить FK без PK

Charanoglu 13.09.2018 20:35

@mheptinstall Я просто тестирую его с помощью Visual Studio Enterprise 2017 (15.8.3), без разницы. FK "существует" только тогда, когда я проверяю таблицу в режиме конструктора.

itminus 14.09.2018 02:50

@JeroenMostert Спасибо! Я тестирую его с помощью SSMS v 17.9, и здесь есть ограничения FK. Кажется, ошибка VS Object Explorer

itminus 14.09.2018 04:04

@Charanoglu Ну, оказывается, на самом деле FK уже там, а мы не можем их увидеть по ошибке. PoC: если я выполню команду sql, выполнив «вставить в значения UserDetail (Biography, UserId) ('hello, wrold', 'here is user id FK')» в Visual Studio, он будет жаловаться, что «Msg 547, уровень 16, Состояние 0, строка 1 Оператор INSERT конфликтует с ограничением FOREIGN KEY «FK_UserDetail_AspNetUsers_UserId». Конфликт произошел в базе данных «App-EFCore-FK-Test», таблица «dbo.AspNetUsers», столбец «Id». Оператор был прерван. . " . Это доказывает, что ФК уже существует.

itminus 14.09.2018 04:06

@JeroenMostert, еще раз спасибо! Не могли бы вы написать ответ, чтобы я мог принять его как ответ? Это может помочь другим парням, попавшим в подобную ситуацию.

itminus 14.09.2018 04:09
1
7
490
0

Другие вопросы по теме