Pomelo.entityframeworkcore.mysql: рдкреЛрдореЗрд▓реЛ 3.0.0-rc1.final рдХреЗ рд╕рд╛рде .NET Core 2.2 рд╕реЗ .NET Core 3.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛рдмреЗрд╕ CPU рд╕реНрдкрд╛рдЗрдХреНрд╕ рдФрд░ рдЕрдкрдВрдЧ рдбреЗрдЯрд╛рдмреЗрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рдЕрдХреНрддреВре░ 2019  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

рдкреНрд░рдЬрдирди рдХрд░рдиреЗ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛

рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЕрдкрдиреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ .NET Framework MVC рд╕реЗ .NET Core 2.2 MVC рдореЗрдВ Identity Framework рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред рдореИрдВ рдкрд┐рдЫрд▓реЗ рд╣рдлреНрддреЗ рдкреЛрдореЗрд▓реЛ 2.2.0 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрд╡ рд╣реБрдЖ рдФрд░ рдЗрд╕рдиреЗ рдПрдХ рдЗрд▓рд╛рдЬ рдХрд┐рдпрд╛ред рдПрдВрдЯрд┐рдЯреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдпрд╛ рдореЗрд░реЗ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдХрд▓ рдореИрдВрдиреЗ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рджреЗрдЦрд╛ рдХрд┐ рдкреЛрдореЗрд▓реЛ рдХреЗ рд▓рд┐рдП 3.0.0-рдЖрд░рд╕реА1.рдлрд╛рдЗрдирд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдмреБрджреНрдзрд┐рдорд╛рди рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП .NET рдХреЛрд░ рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдерд╛ред

рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдкреЛрдореЗрд▓реЛ рдХреЗ 3.0.0-rc1. final рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЛ .NET Core 3 рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдФрд░ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕рд╛рдЗрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рд╕рднреА рдЕрдЪреНрдЫреЗ рд▓рдЧ рд░рд╣реЗ рдереЗред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЬрдм рдореЗрд░реЗ рдЙрддреНрдкрд╛рджрди рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд▓рд╛рдЗрд╡ рд╣реЛрдиреЗ рдХреА рдмрд╛рдд рдЖрдИ, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рд╕рдордп рд╕рд╛рдЗрдЯ рдкрд░ рд▓рдЧрднрдЧ 100-150 рд▓реЛрдЧ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╣реА рдПрдХ рдХрдВрдЯреЗрдирд░ рдлреИрд▓рддрд╛ рд╣реИ, рдореЗрд░рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ 80-100% рд╕реАрдкреАрдпреВ рддрдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рде рд╣реА рд▓реЙрдЧ рдбреЗрдЯрд╛рдмреЗрд╕ рдЯрд╛рдЗрдордЖрдЙрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рддреБрд░рдВрдд рдЖрдЙрдЯрдкреБрдЯ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдореИрдВрдиреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдореМрдХреЛрдВ рдкрд░ рдХреЛрд╢рд┐рд╢ рдХреАред рдЖрдк рдЗрди рджреЛ рдЕрд╡рд╕рд░реЛрдВ рдХреЛ рдиреАрдЪреЗ рдореЗрд░реЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдЖрд░рдбреАрдПрд╕ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

image

рд╕рдорд╕реНрдпрд╛

рд▓реЙрдЧ рдХреЛ рд╕реНрдкрд╛рдЗрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдорд╛рдВрдб рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдШреБрдЯрдиреЛрдВ рдкрд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░ рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдХрдВрдЯреЗрдирд░ рд▓реЗрддрд╛ рд╣реИред рджреБрдЦ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдзрд┐рдХрд░рдг/рд╕рддреНрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЙрдкрдЬреА рд╣реИрдВ:

at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)

(рдиреАрдЪреЗ рдкреВрд░реНрдг рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╕реЗ рд╕реНрдирд┐рдкреЗрдЯ)ред

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдЕрдм рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдпрд╣ рднреА рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдореИрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк.рд╕реАрдПрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдирдП рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВред

рдпрд╣рд╛рдБ рдореЗрд░рд╛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╡рд░реНрдЧ рд╣реИ:

public class Startup 
    { 
        private IConfiguration Configuration { get; } 

        private static readonly ILoggerFactory EfLoggerFactory = LoggerFactory.Create(builder => 
        { 
            builder 
                .AddFilter((category, level) => 
                    category == DbLoggerCategory.Database.Command.Name 
                    && level == LogLevel.Information) 
                .AddConsole(); 
        }); 

        private readonly IWebHostEnvironment environment; 

        public Startup(IConfiguration configuration, IWebHostEnvironment environment) 
        { 
            this.environment = environment; 
            Configuration = configuration; 

            var builder = new ConfigurationBuilder() 
                .SetBasePath(environment.ContentRootPath) 
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
                .AddJsonFile($"appsettings.{environment.EnvironmentName}.json", optional: true) 
                .AddEnvironmentVariables(); 

            Configuration = builder.Build(); 
        } 

        // This method gets called by the runtime. Use this method to add services to the container. 
        public void ConfigureServices(IServiceCollection services) 
        { 
            var redis = ConnectionMultiplexer.Connect(Configuration.GetConnectionString("RedisConnection")); 
            services.AddDataProtection() 
                .PersistKeysToStackExchangeRedis(redis, "DataProtectionKeys"); 

            services.Configure<CookiePolicyOptions>(options => 
            { 
                // This lambda determines whether user consent for non-essential cookies is needed for a given request. 
                options.CheckConsentNeeded = context => false; 
                options.MinimumSameSitePolicy = SameSiteMode.None; 
            });

            services.AddDbContextPool<MyDbContext>( 
                options => options.UseLazyLoadingProxies() 
                    .UseLoggerFactory(EfLoggerFactory) 
                    .UseMySql(Configuration.GetConnectionString(ConnectionStringConstants.DefaultConnectionName), 
                        mySqlOptions => { mySqlOptions.ServerVersion(new Version(5, 7, 24), ServerType.MySql); } 
                    )); 

            services.AddIdentity<User, Role>(options => 
                { 
                    // TODO: Probably should improve the password complexity - requires changes to the registration logic to handle errors when creating user  
                    options.Password.RequireDigit = false; 
                    options.Password.RequiredLength = 6; 
                    options.Password.RequireNonAlphanumeric = false; 
                    options.Password.RequireUppercase = false; 
                    options.Password.RequireLowercase = false; 
                }) 
                .AddEntityFrameworkStores<MyDbContext>(); 

            services.AddAuthentication() 
                .AddFacebook(o => 
                { 
                    o.AppId = Configuration.GetValue<string>("Facebook:FacebookAppId"); 
                    o.AppSecret = Configuration.GetValue<string>("Facebook:FacebookAppSecret"); 
                }); 

            services.AddAuthorization(options => 
            { 
                options.FallbackPolicy = new AuthorizationPolicyBuilder() 
                    .RequireAuthenticatedUser() 
                    .Build(); 
            }); 

            services.ConfigureApplicationCookie(options => 
            { 
                options.LoginPath = "/Welcome"; 
                options.AccessDeniedPath = "/Welcome"; 
            }); 

            services.AddStackExchangeRedisCache(options => 
            { 
                options.Configuration = Configuration.GetConnectionString("RedisConnection"); 
                options.InstanceName = Configuration.GetValue<string>("ApplicationRedisKey"); 
            }); 

            services.AddSession(); 
            services.AddResponseCaching(); 

            RegisterServices(services); 

            services.AddJsEngineSwitcher(options => options.DefaultEngineName = ChakraCoreJsEngine.EngineName) 
                .AddChakraCore(); 

            services.AddReact(); 

            services.AddMvc() 
            .AddJsonOptions(options => 
            { 
                options.JsonSerializerOptions.PropertyNamingPolicy = null; // Enables PascalCase JSON serialization (default for .NET core is camelCase) 
            }) 
            .SetCompatibilityVersion(CompatibilityVersion.Version_3_0); 

            services.AddSignalR().AddStackExchangeRedis(Configuration.GetConnectionString("RedisConnection"), options => 
            { 
                options.Configuration.ChannelPrefix = Configuration.GetValue<string>("SignalRRedisKey"); 
            }); 

            SetStaticConfigValues(); 

            var builder = services.AddControllersWithViews(); 

            if (environment.IsDevelopment()) 
            { 
                builder.AddRazorRuntimeCompilation(); 
            } 

            // AWS Config 
            services.AddDefaultAWSOptions(Configuration.GetAWSOptions()); 
            services.AddAWSService<IAmazonLambda>(); 
            services.AddAWSService<IAmazonS3>(); 
            services.AddAWSService<IAmazonSimpleEmailService>(); 
        } 

        public void ConfigureContainer(ContainerBuilder builder) 
        { 
            var listOfModules = new List<string> 
            { 
                "Blah.Bl.Core.Bootstrapper.BlBootstrapper, Blah.Bl.Core", 
                "Blah.Dal.Core.Bootstrapper.DalBootstrapper, Blah.Dal.Core", 
                "Blah.Domain.Core.Bootstrapper.DomainBootstrapper, Blah.Domain.Core", 
                "Blah.WebUI.Core.Bootstrapper.WebBootstrapper, Blah.WebUI.Core" 
            }; 

            var serviceBootstrappers = new List<Module>(); 

            foreach (var moduleToLoad in listOfModules) 
            { 
                var boostrapperType = Type.GetType(moduleToLoad); 

                var serviceBootstrapper = (Module)Activator.CreateInstance(boostrapperType); 
                serviceBootstrappers.Add(serviceBootstrapper); 
            } 

            serviceBootstrappers.ForEach(module => builder.RegisterModule(module)); 
        } 

        private void SetStaticConfigValues() 
        { 
            ImageHelper.ImageLocation = Configuration.GetValue<string>("ImageLocation"); 
            ImageHelper.ImageBucketName = Configuration.GetValue<string>("ImageBucketName"); 
        } 

        private void RegisterServices(IServiceCollection services) 
        { 
            services.AddOptions(); 

            services.AddScoped<IPasswordHasher<User>, BlowfishPasswordHasher>(); 
            services.AddTransient<IViewRenderService, ViewRenderService>(); 
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
            services.AddSingleton<IActionContextAccessor, ActionContextAccessor>(); 
            services.AddScoped<IIdentityWrapper, IdentityWrapper>(); 
            services.Configure<PaypalConfigSettings>(options => Configuration.GetSection("Paypal").Bind(options)); 
            services.Configure<FacebookConfigSettings>(options => Configuration.GetSection("Facebook").Bind(options)); 
        } 

        private ILoggerFactory GetLoggerFactory() 
        { 
            IServiceCollection serviceCollection = new ServiceCollection(); 
            serviceCollection.AddLogging(builder => 
                builder.AddConsole() 
                    .AddFilter(DbLoggerCategory.Database.Command.Name, LogLevel.Information));  
            return serviceCollection.BuildServiceProvider() 
                .GetService<ILoggerFactory>(); 
        } 

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env) 
        { 
            if (env.IsDevelopment()) 
            { 
                app.UseDeveloperExceptionPage(); 
                app.UseDatabaseErrorPage(); 
            } 
            else 
            { 
                app.UseExceptionHandler("/Home/Error"); 
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. 
                // TODO: Do I want HSTS yet...? probably, uncomment when ready 
                // app.UseHsts(); 
            } 

            app.UseHttpsRedirection(); 
            app.UseResponseCaching(); 

            app.UseWhen(x =>  
                x.Request.HttpContext.Request.Path.ToString().StartsWith("/content/images/"), 
                appBranch => 
                { 
                    appBranch.UseImageHandler(); 
                }); 

            app.UseCookiePolicy(); 
            app.UseSession(); 

            app.UseRewriter(new RewriteOptions() 
                .AddRewrite("^embed.js", "dist/embed/embed.js", true)); 

            app.UseStaticFiles(); 
            app.UseRouting(); 
            app.UseAuthentication(); 
            app.UseAuthorization(); 

            app.UseEndpoints(endpoints => 
            { 
                //.. other routes including signalr setup

                // Default route 
                endpoints.MapControllerRoute( 
                    name: "Default", 
                    pattern: "{controller=Root}/{action=Index}/{urlId:regex((?i)^[a-z0-9]{{6}}$)?}/{takerId?}"); 
            }); 

            // Initialise ReactJS.NET. Must be before static files. 
            app.UseReact(config => 
            { 
                // If you want to use server-side rendering of React components, 
                // add all the necessary JavaScript files here. This includes 
                // your components as well as all of their dependencies. 
                // See http://reactjs.net/ for more information. Example: 
                //config 
                //    .AddScript("~/Scripts/First.jsx") 
                //    .AddScript("~/Scripts/Second.jsx"); 

                // If you use an external build too (for example, Babel, Webpack, 
                // Browserify or Gulp), you can improve performance by disabling 
                // ReactJS.NET's version of Babel and loading the pre-transpiled 
                // scripts. Example: 
                //config 
                //    .SetLoadBabel(false) 
                //    .AddScriptWithoutTransform("~/Scripts/bundle.server.js"); 

                config.JsonSerializerSettings.ContractResolver = new DefaultContractResolver(); // Enables PascalCase JSON serialization (default for .NET core is camelCase) 

                config 
                    .SetReuseJavaScriptEngines(true) 
                    .SetLoadBabel(true) 
                    .SetLoadReact(false) 
                    .AddScriptWithoutTransform("./dist/reactjs/runtime.js") 
                    .AddScriptWithoutTransform("./dist/reactjs/vendors.js") 
                    .AddScriptWithoutTransform("./dist/reactjs/components.js"); 
            }); 
        } 
    } 

рдореБрдЭреЗ рд╕рдЪ рдореЗрдВ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕рдХрд╛ рдирд┐рд╡рд╛рд░рдг рдХреИрд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБред рдореИрдВ рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред

рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдкрд╡рд╛рдж рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдкреВрд░реНрдг рдЕрдкрд╡рд╛рдж рд╡рд┐рд╡рд░рдг (рд╕рдВрджреЗрд╢ рдФрд░ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕) рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВред

Exception message:
Stack trace:
[2019-10-13 20:31:13.7365] 1 - ERROR - Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware - An unhandled exception has occurred while executing the request.
MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
---> MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
---> System.IO.IOException: Unable to read data from the transport connection: Connection timed out.
---> System.Net.Sockets.SocketException (110): Connection timed out
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Security.SslStream.FillBufferAsync[TReadAdapter](TReadAdapter adapter, Int32 minSize)
at System.Net.Security.SslStream.ReadAsyncInternal[TReadAdapter](TReadAdapter adapter, Memory`1 buffer)
at System.Net.Security.SslStream.Read(Byte[] buffer, Int32 offset, Int32 count)
at MySqlConnector.Protocol.Serialization.StreamByteHandler.<ReadBytesAsync>g__DoReadBytesSync|6_0(ArraySegment`1 buffer_) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\StreamByteHandler.cs:line 39
at MySqlConnector.Protocol.Serialization.BufferedByteReader.ReadBytesAsync(IByteHandler byteHandler, ArraySegment`1 buffer, Int32 totalBytesToRead, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\BufferedByteReader.cs:line 37
at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPacketAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 410
at MySqlConnector.Protocol.Serialization.ProtocolUtility.DoReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 previousPayloads, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 468
at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 463
at MySqlConnector.Protocol.Serialization.StandardPayloadHandler.ReadPayloadAsync(ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\StandardPayloadHandler.cs:line 42
at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 732
--- End of stack trace from previous location where exception was thrown ---
at MySqlConnector.Core.ServerSession.ReceiveReplyAsyncAwaited(ValueTask`1 task) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 773
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 111
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 338
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\CommandExecutor.cs:line 63
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 218
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.RelationalShapedQueryCompilingExpressionVisitor.QueryingEnumerable`1.Enumerator.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
at System.Linq.Queryable.First[TSource](IQueryable`1 source, Expression`1 predicate)
at Blah.Bl.Core.Services.QuizStartOgTagsService.GetOgTagsForQuizStart(String urlId, Nullable`1 personalityId) in /Blah.Bl.Core/Services/QuizStartOgTagsService.cs:line 35
at Blah.WebUI.Core.Components.DisplayOgTagsViewComponent.InvokeAsync(String urlId, Nullable`1 personalityId) in /Blah.WebUI.Core/Components/DisplayOgTagsViewComponents.cs:line 22
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsyncCore(ObjectMethodExecutor executor, ViewComponentContext context)
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentInvoker.InvokeAsync(ViewComponentContext context)
at Microsoft.AspNetCore.Mvc.ViewComponents.DefaultViewComponentHelper.InvokeCoreAsync(ViewComponentDescriptor descriptor, Object arguments)
at AspNetCore.Views_Quiz_Start.<>c__DisplayClass14_0.<<ExecuteAsync>b__3>d.MoveNext() in /Blah.WebUI.Core/Views/Quiz/Start.cshtml:line 161
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSectionAsyncCore(String sectionName, Boolean required)
at Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSection(String name, Boolean required)
at AspNetCore.Views_Shared__QuizLayout.<ExecuteAsync>b__8_0() in /Blah.WebUI.Core/Views/Shared/_QuizLayout.cshtml:line 6
at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()
at AspNetCore.Views_Shared__QuizLayout.ExecuteAsync()
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageCoreAsync(IRazorPage page, ViewContext context)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderPageAsync(IRazorPage page, ViewContext context, Boolean invokeViewStarts)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderLayoutAsync(ViewContext context, ViewBufferTextWriter bodyWriter)
at Microsoft.AspNetCore.Mvc.Razor.RazorView.RenderAsync(ViewContext context)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ViewContext viewContext, String contentType, Nullable`1 statusCode)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ExecuteAsync(ActionContext actionContext, IView view, ViewDataDictionary viewData, ITempDataDictionary tempData, String contentType, Nullable`1 statusCode)
at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ExecuteAsync(ActionContext context, ViewResult result)
at Microsoft.AspNetCore.Mvc.ViewResult.ExecuteResultAsync(ActionContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeResultFilters>g__Awaited|27_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.<Invoke>g__Awaited|6_0(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)

рдЖрдЧреЗ рдХреА рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА

MySQL рд╕рдВрд╕реНрдХрд░рдг: 5.6.41
рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо: Amazon ECS, Docker, .NET Core 3.0 рд░рдирдЯрд╛рдЗрдо рдмрд╛рдпреЛрдирд┐рдХ рдЗрдореЗрдЬ
Pomelo.EntityFrameworkCore.MySql рд╕рдВрд╕реНрдХрд░рдг: 3.0.0-rc1. final
Microsoft.AspNetCore.App рд╕рдВрд╕реНрдХрд░рдг: 3.0.0

рдореЗрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг:

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

EF Core рдиреЗ 3.0 рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХреНрд╡реЗрд░реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрджрд▓ рджреАред рдИрдПрдл рдХреЛрд░ 2.2 рдХреЗ рд╡рд┐рдкрд░реАрдд, рдкреНрд░рддреНрдпреЗрдХ LINQ рдХреНрд╡реЗрд░реА рдЕрдм рдПрдХ рдПрдХрд▓ SQL рдХрдерди (рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдХрд┐ LINQ рдХрдИ Include() рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ Include() рдХреЙрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ SELECT рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрдм рдПрдХ рдПрдХрд▓ SELECT рдкреНрд░рддреНрдпреЗрдХ Include() рдХреЙрд▓ рдХреЗ рд▓рд┐рдП JOIN рдХреНрд▓реЙрдЬ рдХреЗ рд╕рд╛рде SELECT рд╕реНрдЯреЗрдЯрдореЗрдВрдЯред

рдЗрд╕рд╕реЗ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж рдмрди рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдореЗрдВ рдХреНрд╡реЗрд░реА рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП https://github.com/aspnet/EntityFrameworkCore/issues/18022 рджреЗрдЦреЗрдВред

рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ MSDN рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреЙрдХреНрд╕ рдореЗрдВ Caution рдмреЙрдХреНрд╕ рднреА рджреЗрдЦреЗрдВ:

рд╕рдВрд╕реНрдХрд░рдг 3.0.0 рдХреЗ рдмрд╛рдж рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдорд┐рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬреЙрдЗрди рдХреЛ рд░рд┐рд▓реЗрд╢рдирд▓ рдкреНрд░рджрд╛рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрд╛рджрд┐рдд SQL рдХреНрд╡реЗрд░реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдмрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд SQL рдХреНрд╡реЗрд░реА рдЙрддреНрдкрдиреНрди рдХреА рдереАред рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдпрд╛ рдмрджрддрд░ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рд╡рд┐рд╕реНрдлреЛрдЯ рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг:

рдЖрдк рдЕрдкрдиреЗ LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдХрдИ Include() рдХрдерди рд╣реИрдВред
рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП .NET рдкреНрд░рджрд░реНрд╢рди рдЯреНрд░реЗрд╕ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рд╕рд╛рде рд╣реА, рдЖрдк рдзреАрдореА рдХреНрд╡реЗрд░реА рд▓реЙрдЧ рдХреЛ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд LINQ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред

@lauxjpn рдЗрд╕ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЙрд╕ рд╕рдордп рд╕реЗ MySQL рдореЗрдВ рдзреАрдореА рдХреНрд╡реЗрд░реА рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЬрдм рд╕реЗ рдЙрд╕рдиреЗ рдореЗрд░реА рд╕рд╛рдЗрдЯ рдХреЛ рдиреАрдЪреЗ рд▓рд╛рдпрд╛ред рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдпрд╣ рдкреЛрдореЗрд▓реЛ/рдИрдПрдл рдпрд╛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрдВрднреАрд░ рдореБрджреНрджрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╢рд╛рдорд┐рд▓() рдерд╛ рдЬрд┐рд╕рдиреЗ рдореЗрд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдШреБрдЯрдиреЛрдВ рдкрд░ рд▓рд╛рдпрд╛ред

рдмрд╕ рдЕрдЧрд░ рдХрд┐рд╕реА рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣ рд╡рд╣ рдкреНрд░рд╢реНрди рд╣реИ рдЬрд┐рд╕рдиреЗ рдпрд╣ рдХрд┐рдпрд╛:

            var quiz = dbContext.Set<Quiz>()
                .Include(x => x.PersonalityOutcomes)
                .ThenInclude(x => x.QuizVersion)
                .First(x => x.UrlId == urlId);

рдПрдХ Include рдФрд░ рдПрдХ ThenInclude ред

рд╢рд╛рдорд┐рд▓ рдиреЗ рдПрдХ рдЗрдирд░ рдЬреЙрдЗрди рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдореЗрдВ рдПрдХ рдХреНрд╡реЗрд░реА рдереА рдЬрд┐рд╕рдиреЗ рдбреЗрдЯрд╛ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╕реНрдХреИрди рдХрд┐рдпрд╛ред рд╕реБрдВрджрд░ рдард┐рдХрд╛рдиреЗред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЕрдкрдирд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

pjc89 picture pjc89  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

findmoon picture findmoon  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

zuosc picture zuosc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bobbd picture bobbd  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hainguyenthanh picture hainguyenthanh  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ