在三层应用程序中的 EF Core 中自动迁移

MrM*_*MVC 4 c# asp.net-mvc entity-framework-core asp.net-core

我在 Asp.net Mvc Core 中有三层应用程序并使用 EF 核心,现在我想创建自动迁移,

我有 DAL 层,我的上下文在这里可用

 public class AdminContext : DbContext
    {

    public AdminContext(DbContextOptions<AdminContext> options) : base(options)
    {

    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<AdsAdsCategory>()
             .HasKey(bc => new { bc.AdsId, bc.AdsCategoryId });

        modelBuilder.Entity<AdsAdsCategory>()
            .HasOne(bc => bc.Ads)
            .WithMany(b => b.AdsAdsCategories)
            .HasForeignKey(bc => bc.AdsId);

        modelBuilder.Entity<AdsAdsCategory>()
            .HasOne(bc => bc.Category)
            .WithMany(c => c.AdsAdsCategories)
            .HasForeignKey(bc => bc.AdsCategoryId);
    }

    public DbSet<Ads> Adses { get; set; }
    public DbSet<AdsCategory> AdsCategories { get; set; }
    public DbSet<AdsPosition> AdsPositions { get; set; }
    public DbSet<AdsCustomer> AdsCustomers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并在我的应用程序启动中

我写了这段代码

var context = app.ApplicationServices.GetService<AdminContext>();

       if (!context.Database.EnsureCreated())
            context.Database.Migrate();
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序数据库已创建并生成表但 __migrationhistory 不存在且迁移未生成时,

在启动时,我删除此行代码

 if (!context.Database.EnsureCreated())
Run Code Online (Sandbox Code Playgroud)

数据库已创建并生成了 __migrationhistory 表,但我的模型表未生成,

我该如何解决这个问题?并在三层应用程序中的 EF Core 中运行自动迁移?

abo*_*avi 6

您需要执行以下操作才能在 MVC .NET Core 中启用迁移。

1-在 Visual Studio 中打开包管理器控制台。键入并执行此代码。

添加迁移类名

pm> add-migration FirstInitialize
Run Code Online (Sandbox Code Playgroud)

2-执行代码后,将为您的模型创建迁移类

 public partial class FirstInitialize : Migration
 {
    protected override void Up(MigrationBuilder migrationBuilder)
   {
  //After executing the code, this section will be automatically   generated for your models 
   }

}
Run Code Online (Sandbox Code Playgroud)

3-然后,使用您在 program.cs main 方法的类部分中输入的以下代码,您的模型将被构建到数据库中。

using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<YouDbContext>();
            context.Database.Migrate();
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the atabase.");
        }
    }
Run Code Online (Sandbox Code Playgroud)

4-每次更改模型或添加新模型时,都必须重复这些步骤。每次为您的迁移选择一个新名称。样本:

pm> add-migration SecondInitialize
Run Code Online (Sandbox Code Playgroud)

*我英语说得不好


Mat*_*391 4

EF core 中不存在像 EF6 中那样的自动迁移。您必须在开始之前生成迁移,然后使用

context.Database.Migrate();
Run Code Online (Sandbox Code Playgroud)

或者您在每次启动时删除整个数据库并使用

context.Database.EnsureCreated();
Run Code Online (Sandbox Code Playgroud)

重新创建更新的数据库。第二个不允许您稍后添加任何迁移,因此您每次都必须重新创建整个数据库。要删除数据库,您可以使用

context.Database.EnsureDeleted();
Run Code Online (Sandbox Code Playgroud)