为什么我的实体框架核心数据库优先模型自定义在重新脚手架更改后就消失了?任何解决方案

问题描述

我正在使用ASP.Net Core 2.1,并且遇到了问题。我一直在致力于实现数据库优先应用程序。最初的Scaffold-DbContext命令可以正常工作,并且可以正确创建我的所有实体。之后,我对用于验证的模型文件进行了一些更改。我的DBA对数据库进行了新更改,因此我重新对数据库进行了脚手架。然后,我注意到重新脚手架会覆盖我添加到所有模型文件中的所有自定义代码有什么办法可以重新搭建数据库,但是只能通过ASP.Net Core DB First Approach中的DBA更改那些文件 每当我遇到这个问题时。 我用以下命令重新搭建支架:

Scaffold-DbContext“服务器= 192.168.46.101;数据库= dbnAME;用户ID = USERID;密码= PASSWORD” Microsoft.EntityFrameworkCore.sqlServer -ContextDir数据-OutputDir模型-UseDatabaseNames -force

我的自定义模型添加了注释:

    //Custom Annotation
    [Key]
    public int COLORCODE { get; set; }

    //Custom Validation
    [required(ErrorMessage = "Color Name can not be empty")]
    public string COLOR { get; set; }

    public string REMARKS { get; set; }

重新搭建我的代码后,就像:

    public int COLORCODE { get; set; }
    public string COLOR { get; set; }
    public string REMARKS { get; set; }

我的Program.cs文件

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureLogging((hostingContext,logging) =>
            {
                logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
                logging.AddConsole();
                logging.AddDebug();
                logging.AddEventSourceLogger();
                logging.AddNLog();
            })
            .UseStartup<Startup>();
}

我的Startup.cs文件

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        services.ConfigureApplicationCookie(options =>
        {
            options.AccessDeniedpath = new PathString("/Administrator/AccessDenied");
        });

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

        services.AddDbContext<Context>(options =>
            options.UsesqlServer(
                Configuration.GetConnectionString("ConnectionName")));


        services.AddIdentity<IdentityUser,IdentityRole>(options =>
        {
            options.Password.requiredLength = 15;
            options.Password.requiredUniqueChars = 5;
            options.Password.RequireNonAlphanumeric = false;

            options.SignIn.RequireConfirmedEmail = true;
            options.Tokens.EmailConfirmationTokenProvider = "CustomEmailConfirmation";

            options.Lockout.MaxFailedAccessAttempts = 5;
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(15);
        })
        .AddEntityFrameworkStores<Context>()
        .AddDefaultTokenProviders()
        .AddTokenProvider<CustomEmailConfirmationTokenProvider<IdentityUser>>("CustomEmailConfirmation");

        // REGISTER ExtractEMService
        ExtractEMService.ExtractEMRegisterService(services);

        //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
            .RequireAuthenticatedUser()
            .Build();
            options.Filters.Add(new Authorizefilter(policy));

        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app,IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseStatusCodePagesWithReExecute("/Error/{0}");

            //app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",template: "{controller=Basic}/{action=BasicColors}/{id?}");
        });
    }
}

解决方法

您无法做到这一点,只能将生成的类保持不变,并使用伙伴类进行数据注释:

[MetadataType(typeof(MetaData))]
public partial class Person
{
    public class MetaData
    {
        [Required]
        [Display(Name = "Enter Your Name")]
        public string FirstName;

      
    }
}

https://ryanhayes.net/data-annotations-for-entity-framework-4-entities-as-an-mvc-model/

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...