EntityFrameworkCore.SQLServer: не удается сопоставить таблицу базы данных с пользовательским классом модели

#c# #sql-server #entity-framework-core

#c# #sql-server #entity-framework-core

Вопрос:

Я использую Microsoft.EntityFrameworkCore.SQLServer (3.1.4) для подключения к моей базе данных SQL Server. Я пытаюсь использовать пользовательский класс модели для «сопоставления» с таблицей State :

 CREATE TABLE [dbo].[State] 
(
    [StateID] INT IDENTITY(1, 1) NOT NULL,
    [Name]    VARCHAR(10) NULL,

    CONSTRAINT [PK_State] PRIMARY KEY CLUSTERED ([StateID] ASC)
);
  

Затем, в моем MyDbContext.cs , я объявил это как:

 public DbSet<State> State { get; set; }
  

Мой пользовательский класс модели State :

 public enum StateID: int
{
    Processed = 1,
    Intransit = 2,
    Delivered = 3,
    Lost = 4,
    Reordered = 5,
}

public class State
{
    private State() { }
 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public StateID StateID {get; set; }
    [StringLength(10)]
    public string Name {get; set;}
}
  

Когда я пытаюсь получить список состояний с помощью моего пользовательского класса модели через MyDbContext.State.ToList() , я продолжаю получать исключение:

Microsoft.Data.SqlClient.SQLException: ‘Недопустимое имя объекта ‘Состояние’.’

Частично созданный стек вызовов выглядит следующим образом:

Microsoft.Data.SqlClient.SqlConnection.Ошибка (Microsoft.Data.SqlClient.SQLException, bool, System.Действие<Система.Действие>)
Microsoft.Data.SqlClient.SqlInternalConnection.Ошибка (Microsoft.Data.SqlClient.SQLException, bool, System.Действие<Система.Действие>)
Microsoft.Data.SqlClient.TdsParser.Throw exceptionandwarning (Microsoft.Data.SqlClient.TdsParserStateObject, bool, bool)
Microsoft.Data.SqlClient.TdsParser.Попробуйте выполнить (Microsoft.Data.SqlClient.RunBehavior, Microsoft.Data.SqlClient.SqlCommand, Microsoft.Data.SqlClient.SqlDataReader, Microsoft.Data.SqlClient.BulkCopySimpleResultSet, Microsoft.Data.SqlClient.TdsParserStateObject, out bool)
Microsoft.Data.SqlClient.SqlDataReader.Попробуйте consumemetadata()
Microsoft.Data.SqlClient.SqlDataReader.MetaData.get() Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader (Microsoft.Data.SqlClient.SqlDataReader, Microsoft.Data.SqlClient.RunBehavior, строка, bool, bool, bool) Microsoft.Data.SqlClient.SqlCommand.RunExecuteReaderTds (System.Data.CommandBehavior, Microsoft.Data.SqlClient.RunBehavior, bool, bool, int, out System.Многопоточность.Задачи.Task, bool, bool, Microsoft.Data.SqlClient.SqlDataReader, bool)
Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader (System.Data.CommandBehavior, Microsoft.Data.SqlClient.RunBehavior, bool, System.Многопоточность.Задачи.TaskCompletionSource, int, out System.Многопоточность.Задачи.Задача, вывод bool, bool, bool, string)
Microsoft.Data.SqlClient.SqlCommand.RunExecuteReader (System.Data.CommandBehavior, Microsoft.Data.SqlClient.RunBehavior, bool, строка)

Комментарии:

1. Это исключение обычно просто означает, что таблица не существует в запрашиваемой базе данных. Хорошим первым шагом было бы убедиться, что таблица State существует в БД, на которую указывает строка подключения

2. @devNull Да, она существует в БД с точно такими же атрибутами / полями

3. Затем проследите соединение и команды в EF ( learn.microsoft.com/en-us/ef/core/miscellaneous/logging?tabs=v3 ) или в SQL Server ( learn.microsoft.com/en-us/sql/tools/sql-server-profiler /… или learn.microsoft.com/en-us/sql/relational-databases / … )