EF Core: преобразование базы данных: неверный столбец внешнего ключа - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь охватить ядро ​​asp.net путем миграции моего существующего приложения с .net 4.6.2 с EF6 на .net Core 2.2 с EF Core.

Учитывая, что у меня есть существующая база данных, я сгенерировал модель из базы данных, чтобы начать с нее. Все имена моих столбцов используют подчеркивания, и там, где находятся внешние ключи, все они начинаются с имени таблицы.

В EF Core он настаивает на том, чтобы имена моих столбцов кода менялись с Manager_UserLogin_ID на ManagerUserLoginId, что нормально, и я могу просмотреть свой код

Проблема возникает, когда я пытаюсь сделать запрос UserLogin и Manager, используя include

__DB.UserLogin.Include(x=>x.Manager).First();

При попытке выполнить запрос пытается включить столбец UserLoginId в запрос Manager, а также столбец Manager_UserLogin_ID.

Классы следующие

public partial class Manager
{
    public int ManagerId { get; set; }
    public int ManagerCompanyId { get; set; }
    public int ManagerUserLoginId { get; set; }
    public virtual Company ManagerCompany { get; set; }
    public virtual UserLogin ManagerUserLogin { get; set; }
}

public partial class UserLogin
{
    public UserLogin()
    {
        Manager = new HashSet<Manager>();
    }

    public int UserLoginId { get; set; }
    public string FullName { get; set; }

    public virtual ICollection<Manager> Manager { get; set; }
}

public partial class Company
{
    public Company()
    {
        Manager = new HashSet<Manager>();
    }

    public int CompanyId { get; set; }
    public string CompanyName { get; set; }

    public virtual ICollection<Manager> Manager { get; set; }
}

Контекст EF Core имеет следующий

protected override void OnModelCreating(ModelBuilder modelBuilder
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Company>(entity =>
    {
        entity.HasKey(e => e.CompanyId).HasName("PK_Company_ID");
        entity.Property(e => e.CompanyId).HasColumnName("Company_ID");

        entity.Property(e => e.CompanyName)
            .IsRequired()
            .HasColumnName("Company_Name")
            .HasMaxLength(200);

    modelBuilder.Entity<Manager>(entity =>
    {
        entity.HasKey(e => e.ManagerId)
            .HasName("PK_Manager_ID")
            .ForSqlServerIsClustered(false);

        entity.HasIndex(e => new { e.ManagerCompanyId, e.ManagerUserLoginId })
            .HasName("IX_Manager")
            .IsUnique()
            .ForSqlServerIsClustered();

        entity.Property(e => e.ManagerId).HasColumnName("Manager_ID");

        entity.Property(e => e.ManagerCompanyId).HasColumnName("Manager_Company_ID");

        entity.Property(e => e.ManagerUserLoginId).HasColumnName("Manager_UserLogin_ID");

        entity.HasOne(d => d.ManagerCompany)
            .WithMany(p => p.Manager)
            .HasForeignKey(d => d.ManagerCompanyId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Manager_Company_ID");

        entity.HasOne(d => d.ManagerUserLogin)
            .WithMany(p => p.Manager)
            .HasForeignKey(d => d.ManagerUserLoginId)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("FK_Manager_UserLogin_ID");
        });

    modelBuilder.Entity<UserLogin>(entity =>
    {
        entity.HasKey(e => e.UserLoginId).HasName("PK_UserLogin_ID");
        entity.HasIndex(e => e.UserLoginUid)
            .HasName("IX_UserLogin_UID")
            .IsUnique();

        entity.Property(e => e.UserLoginId).HasColumnName("UserLogin_ID");

        entity.Property(e => e.FullName)
            .IsRequired()
            .HasColumnName("Full_Name")
            .HasMaxLength(300);

        entity.Property(e => e.UserLoginUid).HasColumnName("UserLogin_UID");
    });

А вот запрос от Sql Profiler



    exec sp_executesql N'SELECT [x.Manager].[Manager_ID], [x.Manager].[Manager_Company_ID], [x.Manager].[Manager_UserLogin_ID], , [x.Manager].[UserLoginId]
    FROM [Manager] AS [x.Manager]
    INNER JOIN (
        SELECT TOP(1) [x0].[UserLogin_ID]
        FROM [UserLogin] AS [x0]
        WHERE [x0].[UserLogin_UID] = @____UID_0
        ORDER BY [x0].[UserLogin_ID]
    ) AS [t] ON [x.Manager].[Manager_UserLogin_ID] = [t].[UserLogin_ID]
    ORDER BY [t].[UserLogin_ID]',N'@____UID_0 uniqueidentifier',@____UID_0='F55C9BBB-C7FF-4C87-B834-B2FE6B0F0B17'

Может кто-нибудь помочь мне диагностировать и устранить эту проблему?

1 Ответ

0 голосов
/ 10 января 2019

Вчера я попробовал несколько вещей, и я был в порядке с изменением свойстваNames:

Измените public int ManagerUserLoginId { get; set; } на public int Manager_UserLogin_Id { get; set; } и удалите entity.Property(e => e.Manager_UserLogin_Id).HasColumnName("Manager_UserLogin_ID"); из вашей модели Builder.

Это быстрое исправление .. Проблема, которая стоит за этим, кажется, большая проблема. Я бы создал новую базу данных с той же конфигурацией / классами VS, созданной для вас.

  • Создать новый проект
  • Добавить строку подключения с новым именем БД
  • Вставьте в свои классы
  • Создать новый DbContext
  • Зайдите в консоль менеджера пакетов и вставьте add-migration InitialMigration

Ef Core создаст миграцию для создания новой базы данных на основе конфигурации вашей модели. Внимание : убедитесь, что ваша строка соединений не указывает ни на одну из существующих баз данных. Если вы выполните миграцию, вы потеряете данные в любой существующей базе данных!

  • Если вы абсолютно уверены , что вы указываете на новую вставку БД в update-database

После этого вы можете вставить новые данные в свою TestDB, чтобы проверить, в чем проблема.

...