Проект 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.