স্থানীয় বিকাশ ভঙ্গ না করে ইফ কোরে অ্যাজুরি এসকিউএল সার্ভার সংস্করণ উল্লেখ করুন


10

সত্তা ফ্রেমওয়ার্ক কোর একটি অ্যাজুরি এসকিউএল সার্ভারের সংস্করণটি পরিবর্তন করতে হ্যাসসোর্সটিয়ার এবং হ্যাস্পেরফরম্যান্স লেভেলগুলি প্রবর্তন করেছে । আপনি এগুলিকে অনমোডেল তৈরিতে ব্যবহার করতে পারেন :

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.HasServiceTier("Basic");
    modelBuilder.HasPerformanceLevel("Basic");
}

আপনি যদি অ্যাড-মাইগ্রেশন অ্যাড-মাইগ্রেশন ব্যবহার করেন তবে আপনি এই জাতীয় স্থানান্তর পাবেন:

public partial class ChangedDatabaseServiceTierToBasic : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterDatabase()
            .Annotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.AlterDatabase()
            .OldAnnotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
    }
}

এটি ঠিকঠাক কাজ করেছে বলে মনে হচ্ছে তবে যখন আমি এই অভিবাসন স্থানান্তরের জন্য স্থানীয় স্থানীয়-অজুরি ডিবিতে প্রয়োগ করার চেষ্টা করি তখন আমি নিম্নলিখিত ত্রুটিটি পাই:

Microsoft.EntityFrameworkCore.Migrations[20402]
      Applying migration '20200413102908_ChangedDatabaseServiceTierToBasic'.
Applying migration '20200413102908_ChangedDatabaseServiceTierToBasic'.
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      BEGIN
      DECLARE @db_name NVARCHAR(MAX) = DB_NAME();
      EXEC(N'ALTER DATABASE ' + @db_name + ' MODIFY ( 
      EDITION = ''Basic'', SERVICE_OBJECTIVE = ''Basic'' );');
      END
Failed executing DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
BEGIN
DECLARE @db_name NVARCHAR(MAX) = DB_NAME();
EXEC(N'ALTER DATABASE ' + @db_name + ' MODIFY ( 
EDITION = ''Basic'', SERVICE_OBJECTIVE = ''Basic'' );');
END
Microsoft.Data.SqlClient.SqlException (0x80131904): Incorrect syntax near '.'.
   at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean isAsync, Int32 timeout, Boolean asyncWrite)
   at Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry, String methodName)
   at Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery()
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabaseImpl(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.UpdateDatabase.<>c__DisplayClass0_0.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:d9f92b81-9916-48ee-9686-6d0f567ab86f
Error Number:102,State:1,Class:15
Incorrect syntax near '.'.

আমি ধরে নিলাম কমান্ডগুলি অজুরি ডিবি-র জন্য বৈধ নয়। সুতরাং প্রশ্নটি হ'ল: আমি কীভাবে এই আদেশগুলি নন-অ্যাজুর ডিবিতে কার্যকর করতে আটকাতে পারি?


আপনার স্থানান্তরগুলি কীভাবে পরিচালিত হয়? কোডে থাকলে, আপনি ASPNETCORE_ENVIRONMENT ডকস.মাইক্রোসফট
প্যাট্রিক

@ পেট্রিকগুড যা আমাকে কেবল স্থানীয় ডিবি-র জন্য মাইগ্রেশন পুরোপুরি অক্ষম করতে দেয়, তাই না? আমি চাই যে এগুলি ব্যতীত সমস্ত মাইগ্রেশন চলুক। একটি সমাধান হ'ল মাইগ্রেশনের সামগ্রীটি একটি কনফিগার-ভেরিয়েবলের উপর নির্ভরশীল করে তোলা। আমি আরও আশ্চর্য হয়েছি যে এর থেকে আরও মার্জিত সমাধান আছে কিনা।
টিম পোহলমান

1
উদ্বিগ্নতাগুলি অপচয় করার পরিবর্তে আপনার এটি সত্যই ইএফ কোর ইস্যু ট্র্যাকারে পোস্ট করা উচিত কারণ এটি তাদের বাগ / ইস্যু - উত্স । আপনি দেখতে পাচ্ছেন যে অন্যান্য জিনিসের জন্য শর্তসাপেক্ষ ব্লক রয়েছে তবে এটির জন্য নয়। অবশ্যই আপনি তাদের ক্লাসটি কাস্টম দিয়ে প্রতিস্থাপন করতে পারেন, তবে আপনাকে পুরো পদ্ধতিটি অনুলিপি / পেস্ট / পরিবর্তন করতে হবে।
ইভান স্টয়েভ

1
আমি সবেমাত্র দেখেছি যে আপনি ইতিমধ্যে তা করে ফেলেছেন - # 20682 । শুভকামনা।
ইভান স্টয়েভ

1
@ ইভানস্টয়েভ এটি উত্স কোডের কিছু আকর্ষণীয় অন্তর্দৃষ্টি। এটি খনন করার জন্য ধন্যবাদ।
টিম পোহলমান

উত্তর:


3

ইএফ কোর দলটি এখন বিষয়টি সম্পর্কে অবগত এবং তাদের ব্যাকলগে এটি যুক্ত করেছে: https://github.com/dotnet/efcore/issues/20682

ইতোমধ্যে সরকারীভাবে প্রস্তাবিত কাজের মতটি দেখতে এইরকম:

migrationBuilder.Sql(@"IF SERVERPROPERTY('EngineEdition') = 5
EXEC(N'ALTER DATABASE [ThreeOne.SomeDbContext] MODIFY (EDITION = ''Basic'',  SERVICE_OBJECTIVE = ''Basic'' );');
");

আমি বর্তমান ডাটাবেসের নাম না জেনে এটিতে কাজ করেছিলাম:

migrationBuilder.Sql
(
@"declare @dbname varchar(100)
set @dbname=quotename(db_name())
IF SERVERPROPERTY('EngineEdition') = 5
EXEC(N'ALTER DATABASE '+@dbname+' MODIFY (EDITION = ''Basic'', SERVICE_OBJECTIVE = ''Basic'' );');"
);

0

অবশ্যই EDITIONএবং SERVICE_OBJECTIVEঅজুরি এসকিউএল ডেটাবেসগুলির জন্য সমর্থিত নয়।

আপনার কমান্ডগুলি কেবল অ্যাজুরে ডাটাবেসের জন্য চালানো দরকার। অন্যান্য ধরণের এসকিউএল সার্ভারের জন্য আপনার কোডটি কার্যকর করতে হবে।

আমি এসকিউএল সার্ভার সংস্করণ সনাক্ত করার পরামর্শ দিই আপনার কোড চালানোর আগে ।

এই উদ্দেশ্যে আপনি এক্সটেনশন পদ্ধতি যুক্ত করতে পারেন:

public static class DatabaseFacadeExtensions
{
    public static bool IsSqlAzure(this DatabaseFacade database)
    {
        var parameter = new SqlParameter("edition", SqlDbType.NVarChar)
        {
            Size = 128,
            Direction = ParameterDirection.Output
        };

        database.ExecuteSqlCommand("SELECT @edition = CAST(SERVERPROPERTY('Edition') AS NVARCHAR)", parameter);

        var edition = parameter.Value.ToString();

        return edition.Equals("SQL Azure", StringComparison.OrdinalIgnoreCase);
    }
}

এবং আপনার OnModelCreatingপদ্ধতির অভ্যন্তরে আপনি পরবর্তী কোড ব্যবহার করতে পারেন:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    if (Database.IsSqlAzure())
    {
        modelBuilder.HasServiceTier("Basic");
        modelBuilder.HasPerformanceLevel("Basic");
    }
}

আমি সন্দেহ করি এটি কাজ করে যাচ্ছে। যে সমস্যাগুলির কারণে কোডগুলি অনমোডেলক্রিয়েটিংয়ে নয় তা মাইগ্রেশনে অবস্থিত। আমি মাইগ্রেশনে নিজেই এরকম কিছু ব্যবহার করার বিষয়টি বিবেচনা করেছি তবে এটি কিছুটা দুর্বল বলে মনে হচ্ছে, যার কারণে আমি এই প্রশ্নটি খুললাম।
টিম পোহলমান

0

এটি খুব ভুল মনে হলেও এটি কার্যকর:

public partial class ChangedDatabaseServiceTierToBasic : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        if (IsHostedInAzure())
        {
            migrationBuilder.AlterDatabase()
                .Annotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
        }
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        if (IsHostedInAzure())
        {
            migrationBuilder.AlterDatabase()
                .OldAnnotation("SqlServer:EditionOptions", "EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic'");
        }
    }

    private static bool IsHostedInAzure()
    {
        var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env}.json", optional: true, reloadOnChange: true)
            .Build();

        var isHostedInAzureConfig = config["DatabaseSettings:IsHostedInAzure"];
        var setEdition = bool.TryParse(isHostedInAzureConfig, out var isHostedInAzure) && isHostedInAzure;
        return setEdition;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.