使用 EFcore / ASP.net core 更新查找表中的数据的正确方法?我是用种子方法还是其他方法来做到这一点?

pun*_*ter 2 seeding entity-framework-core asp.net-core

现在我正在开发中,并使用下面的代码来播种查找表。但是一旦投入生产,我想添加额外的数据,我该怎么做?我是否在播种方法中使用某种 AddOrUpdate (不在核心中)?编写 SQL 脚本?

 private static async Task SeedRfReportStateTypesAsync(PwdrsContext pwdrsContext)
    {
        if (pwdrsContext.RfReportStateTypes.Any())
        {
            return;
        }

        List<RfReportStateType> rfReportStateTypes = new List<RfReportStateType>()
        {
            new RfReportStateType() { Name = "Draft", UpdatedBy = "SYSTEM", UpdatedOn = DateTime.Now}, //4
            new RfReportStateType() { Name = "Review", UpdatedBy = "SYSTEM", UpdatedOn = DateTime.Now}, //3
            new RfReportStateType() { Name = "Stage", UpdatedBy = "SYSTEM", UpdatedOn = DateTime.Now}, //2
            new RfReportStateType() { Name = "Prod", UpdatedBy = "SYSTEM", UpdatedOn = DateTime.Now} //1
        };

        pwdrsContext.RfReportStateTypes.AddRange(rfReportStateTypes);
        await pwdrsContext.SaveChangesAsync();
    }
Run Code Online (Sandbox Code Playgroud)

Chr*_*att 5

您当前的播种方式已被弃用。如果您按预期处理播种,则种子数据的插入、更新等将由 EF Core 自动处理。现在可以在OnModelCreating您的上下文中通过流畅的配置来完成:

modelBuilder.Entity<RfReportStateType>().HasData(
    new RfReportStateType { Id = 4, Name = "Draft" },
    new RfReportStateType { Id = 3, Name = "Review" },
    new RfReportStateType { Id = 2, Name = "Stage" },
    new RfReportStateType { Id = 1, Name = "Prod" }
);
Run Code Online (Sandbox Code Playgroud)

一些笔记。首先,您必须包含 id。这样 EF Core 就知道要插入、更新或删除哪些项目。新的 ID 将被插入,已删除的 ID 将被删除,并且任何现有的 ID 将被更新。由于 id 已知,它还使得创建关系等成为可能。其次,类似的事情UpdatedOn应该通过自动生成的值来处理,而不是在种子数据中指定,否则它将在每次运行时触发更新,因为DateTime.Now一次运行到下一次运行总是不同的。这样,您还可以指定是否仅在添加或更新时生成它,使其非常适合创建/更新日期等内容。一般来说,您的种子数据应仅包含静态值,以便仅当您专门更改这些值之一时才会触发更新。第三,UpdatedBy如果您愿意,您可以包含 ,但这可能会通过列上的默认值更好地处理,即除非SYSTEM传递更具体的内容。