首页 > 解决方案 > Entity Framework 6 自动迁移在生产服务器上定期重建表

问题描述

每天将我的项目重新部署到生产服务器后,它会重建数据库中的两个表(BatchImportDatas 和 BatchImportLogs),删除这些表中的所有数据。但是,这不会发生在我的开发数据库上,并且仅发生在两个表上,尽管应用程序中的许多其他表也由 EF 6 自动迁移管理。由于我使用的是自动迁移,因此在应用程序的迁移文件夹中没有生成迁移文件,但是我确信 EF 迁移是罪魁祸首,因为发生这种情况时,在 _MigrationHistory 表中输入了迁移条目。我已经删除了 _MigrationHistory 表中的所有相关记录,并强制重建受影响的数据库表,但这并没有解决这个问题。我不想删除所有迁移记录并重建整个生产数据库,因为部分应用程序正在使用中,而数据库中的其他表包含实时数据。以下是我的项目的 EF 配置详细信息。任何建议将不胜感激,谢谢。

迁移配置文件:

namespace SYSTEM_Base.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class newDb_Configuration : DbMigrationsConfiguration<SYSTEM_Base.Entities.Commissions.CommissionsBase_New>
    {
        public newDb_Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = false;
        }

        protected override void Seed(SYSTEM_Base.Entities.Commissions.CommissionsBase_New context)
        {
            //context.Database.ExecuteSqlCommand("DBCC CHECKIDENT('BatchImportLogs', RESEED, 1000);");
        }
    }
}

DbContext(数据库核心配置):

using SYSTEM_Base.Migrations;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Providers.Entities;
using System.Web.Security;

namespace SYSTEM_Base.Entities.Commissions
{
        public class CommissionsBase_New : DbContext
        {
            public CommissionsBase_New() : base("SYSTEM") { }

            public DbSet<MembershipAddProperty> MembershipAddProperties { get; set; }

            public DbSet<AppSetting> AppSettings { get; set; }

            public DbSet<ReportRoleLevel> ReportRoleLevels { get; set; }

            public DbSet<ResetPasswordRequest> ResetPasswordRequests { get; set; }

            public DbSet<BatchImportData> BatchImportData { get; set; }

            public DbSet<BatchImportLog> BatchImportLog { get; set; }

            protected override void OnModelCreating(DbModelBuilder builder)
            {
                Database.SetInitializer(new MigrateDatabaseToLatestVersion<CommissionsBase_New, newDb_Configuration>());
            }
        }
}

开发数据库中的最后 10 条 _MigrationHistory 记录:

开发数据库中的最后 10 条 _MigrationHistory 记录:

生产数据库中的最后 10 条 _MigrationHistory 记录:

生产数据库中的最后 10 条 _MigrationHistory 记录:

标签: c#winformsentity-framework

解决方案


听起来您有多个使用定义的 EF 上下文版本的生产代码实例。如果是这种情况,请确保包含迁移脚本的 DLL 都针对同一版本运行。否则,您将遇到您描述的数据库架构不断升级/降级的场景

您提到的版本不是包含您的CommissionsBase_New和/或您的程序集newDb_Configuration的版本,而是EntityFramework.dll版本。

从您的日志中可以清楚地看出,您的应用程序有 2 个版本在生产中运行,这意味着您可能有 2 个(或更多)不同版本的生成程序集,其中包含您的CommissionsBase_New和/或newDb_Configuration


推荐阅读