Именование конфигурации тега в соединении EF

Проект API -> C# -> .Net 4.8 -> EF6 -> Перешел в базу данных SQL Azure и иногда сталкивался с этим:

Возникло исключение, которое, вероятно, связано с временным сбоем. Если вы подключаетесь к базе данных SQL Azure, рассмотрите возможность использования SqlAzureExecutionStrategy.

Я использовал принятый ответ здесь, чтобы помочь мне ответить на мой вопрос: УстановитьExecutionStrategy для SqlAzureExecutionStrategy с помощью DbMigrationsConfiguration?

и, кажется, это сработало.

Я создал новый класс:

public class DataContextConfiguration : DbConfiguration
{
    public DataContextConfiguration()
    {
        SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    }
}

и добавил это как ссылку на мой файл context.cs:

[DbConfigurationType(typeof(DataContextConfiguration))]
public partial class APIEntities : DbContext
{

и кажется, что все работает, но в верхней части файла APIEntities указано:

<auto-generated>
This code was generated from a template.
Manual changes to this file may cause unexpected behavior in your application.
Manual changes to this file will be overwritten if the code is regenerated.
</auto-generated>

Это означает, что он будет сгенерирован повторно при внесении изменений в файл edmx.

Итак, глядя на этот пост: https://learn.microsoft.com/en-us/ef/ef6/fundamentals/configuring/code-based

Я хочу изменить это DataContextConfiguration, чтобы оно загружалось из типа ConfigurationType объектаFrameworkcode в строке подключения, но у меня возникла небольшая путаница с именованием.

Там говорится:

Значение codeConfigurationType должно быть полным именем сборки и пространства имен вашего класса DbConfiguration.

Итак, если мой проект:

ИмяПроекта1 → Конфигурация контекста данных (имя файла)

и «MyAssembly», если его получить, щелкнув правой кнопкой мыши по проекту и просмотрев имя сборки: (что совпадает с ProjectName1)

Означает ли это, что я бы установил тег codeConfigurationType как:

  <entityFramework codeConfigurationType = "ProjectName1.DataContextConfiguration, ProjectName1">

Это правильно, пожалуйста?

В теге codeConfigurationType должно быть указано полное имя сборки и пространства имен вашего класса DbConfiguration. В вашем случае, если ваш проект называется ProjectName1, а ваш класс DbConfiguration — DataContextConfiguration, то для тега codeConfigurationType должно быть установлено значение: <entityFramework codeConfigurationType = "ProjectName1.DataContextConfiguration‌​, ProjectName1"> При этом класс DataContextConfiguration будет загружен из сборки ProjectName1 как DbConfiguration для вашего приложения Entity Framework.

Arko 09.04.2024 06:22

Классы EF объявлены как partial не зря. Вы можете создать/объявить свой собственный класс (с тем же именем) и добавить к нему атрибуты. Объявленный вами класс не будет перезаписан при повторном создании файла EDMX.

Alex 10.04.2024 11:49

Всем спасибо за ответ, @Arko спасибо за подтверждение, если напишете, я присужу баллы, спасибо

John 12.04.2024 21:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
162
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

При переходе к базе данных SQL Azure рекомендуется использовать SqlAzureExecutionStrategy для обработки временных сбоев. Внесенные вами изменения конфигурации — это шаг в правильном направлении. Чтобы решить вашу озабоченность по поводу автоматически созданного файла DbContext, правильно, что любые изменения, внесенные в этот файл вручную, будут потеряны, если код будет повторно создан из файла EDMX. Однако, поскольку классы EF определяются как partial, вы можете безопасно создать отдельный файл со своими пользовательскими модификациями класса DbContext.

Теперь, чтобы указать свой класс DbConfiguration в файле конфигурации, вы правы в своем подходе. Если имя сборки вашего проекта и пространство имен по умолчанию — «ProjectName1», а ваш класс DbConfiguration называется DataContextConfiguration, раздел конфигурации entityFramework в вашем файле Web.config или App.config должен выглядеть следующим образом:

<entityFramework codeConfigurationType = "ProjectName1.DataContextConfiguration, ProjectName1">
  <!-- Your EF config -->
</entityFramework>

Просто убедитесь, что пространство имен вашего класса DataContextConfiguration соответствует пространству имен, указанному в атрибуте codeConfigurationType. Это заставит Entity Framework использовать класс DataContextConfiguration для конфигурации.

Не забудьте добавить атрибут DbConfigurationType в свой класс DbContext в отдельный файл.

namespace ProjectName1
{
    [DbConfigurationType(typeof(DataContextConfiguration))]
    public partial class APIEntities : DbContext
    {
        // Your context's code here
    }
}

Сохраняя настройки в отдельном файле, вы можете гарантировать, что ваша конфигурация останется неизменной даже при повторном создании классов на основе EDMX.

Использованная литература:

Для этого я использую следующее. Если имя базы данных — Database1, то ниже приведен собственный код, который я написал, чтобы это работало.

  1. Я создал общедоступный частичный класс для существующего автоматически сгенерированного DbContext для моего пользовательского кода. (Он не перезаписывается каждый раз, когда я запускаю шаблон)
  2. Я создал стратегию выполнения и прикрепил ее к этому частичному классу.

Код:

[DbConfigurationType(typeof(CustomDbConfiguration))]
public partial class Database1Entities : DbContext
{
  public DBEntities(string pDbName) : base(pDbName)
  {}
}



 public class CustomDbConfiguration : DbConfiguration
 {
     public CustomDbConfiguration()
     {
         SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
     }
 }

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