Проект 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">
Это правильно, пожалуйста?
- Конфигурация на основе кода — Entity Framework 6
Классы EF объявлены как partial не зря. Вы можете создать/объявить свой собственный класс (с тем же именем) и добавить к нему атрибуты. Объявленный вами класс не будет перезаписан при повторном создании файла EDMX.
Всем спасибо за ответ, @Arko спасибо за подтверждение, если напишете, я присужу баллы, спасибо





При переходе к базе данных 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, то ниже приведен собственный код, который я написал, чтобы это работало.
Код:
[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());
}
}
В теге codeConfigurationType должно быть указано полное имя сборки и пространства имен вашего класса DbConfiguration. В вашем случае, если ваш проект называется ProjectName1, а ваш класс DbConfiguration — DataContextConfiguration, то для тега codeConfigurationType должно быть установлено значение:
<entityFramework codeConfigurationType = "ProjectName1.DataContextConfiguration, ProjectName1">При этом класс DataContextConfiguration будет загружен из сборки ProjectName1 как DbConfiguration для вашего приложения Entity Framework.