Непостижимые ошибки из Entity Framework - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь реализовать базовый пример Entity Framework, используя подход Code First , с внешней базой данных. Я просто хочу прочитать некоторые уже существующие данные из таблицы в моей базе данных. Способ, которым я реализовал это работает, в том смысле, что он показывает правильный вывод, но он генерирует кучу исключений во время процесса. Я нашел строку кода, во время которой генерируются исключения, но я не могу их перехватить, используя try / catch (см. Code).

Вот дамп экрана журнала вывода (отладка), когда я запускаю программу (я выделил окончательный вывод розовым цветом): enter image description here

А вот снимок экрана таблицы, к которой я подключаюсь: enter image description here

Даже если выходные данные верны, ошибки, похоже, влияют на производительность. Выполнение кода занимает где-то 2-3 секунды, хотя таблица содержит только шесть столбцов и три строки.

Что я сделал не так, чтобы заставить его так себя вести?

CODE

Функция, которая использует EF-соединение:

public PrintFirstEmployeeName()
{
    try
    {
        UniContext db = new UniContext();

        // Exceptions are thrown during this line of code:
        string fullName = db.Employees.FirstOrDefault().first_name 
                  + " " + db.Employees.FirstOrDefault().last_name; 

        Debug.WriteLine($"Hello { fullName }!");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
}

Модель сотрудника (имена совпадают с именами базы данных 1: 1):

[Table("dbo.sandbox_employee")]
public class EmployeeModel
{
    [Key]
    public int employee_id { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public int age { get; set; }
    public int company_id { get; set; }
}

Реализация dbContext:

public class UniContext : DbContext
{
    public UniContext() : base("Name=MyConnString") { }
    public DbSet<EmployeeModel> Employees { get; set; }
}

И, наконец, файл App.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=xxx" requirePermission="false" />
  </configSections>

  <connectionStrings>
    <add name="MyConnString" connectionString="Integrated Security = SSPI; Persist Security Info = False; Data Source = MyServer; Database = MyDatabase" providerName="System.Data.SqlClient"/>
  </connectionStrings>

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
  </startup>

  <entityFramework>

    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">

      <parameters>
        <parameter value="System.Data.SqlClient" />
      </parameters>

    </defaultConnectionFactory>

    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>

</entityFramework>

</configuration>

ОШИБКА

Насколько я могу судить, есть 3 разных ошибки. Все они брошены несколько раз ...

  1. Exception thrown: 'System.Data.SqlClient.SqlException' in System.Data.dll
  2. Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.dll
  3. Exception thrown: 'System.Data.Entity.Core.EntityCommandExecutionException' in EntityFramework.SqlServer.dll

1 Ответ

0 голосов
/ 08 мая 2018

Две таблицы dbo.__MigrationHistory и dbo.EdmMetadata (обычно) не существуют для существующих баз данных. Entity Framework (EF) ищет эти таблицы во время инициализации, что вызывает исключения, которые я видел. Установка инициализации на null сразу после создания экземпляра DbContext скажет EF не искать эти таблицы, и исключений не будет.

using (UniContext db = new UniContext())
{
    Database.SetInitializer<UniContext>(null); // Prevents initialization exceptions

    var emp = db.Employees.First();

    Debug.WriteLine($"Hello { emp.FirstName } { emp.LastName }!");
}
  • Подробнее см. .
  • Спасибо @JohnyL за помощь в разгадке тайны.
...