脚手架Db上下文并自动删除OnConfiguring方法

AH.*_*AH. 5 .net c# asp.net-core

对于我们的ASP.NET Core项目,我们使用Package Manger控制台中的Scaffold-DbContext搭建现有数据库。

每次我们进行脚手架时,都会与所有实体一起生成一个上下文类,并且该类包含OnConfiguring(..)方法,该方法调用optionsBuilder.UseSqlServer(..)以将上下文配置为连接到SQL Server数据库。

我们在appsettings.json文件中定义了连接字符串,并且不想使用OnConfiguring(..)方法,所以问题是,是否存在一种自动删除OnConfiguring(..)方法的方法,我们不必在每次运行脚手架时手动进行操作。

Chr*_*lin 7

您正在搜索的选项是:--no-onconfiguring

dotnet ef dbcontext scaffold
    "server=.\SqlExpress;database=MyDb;Trusted_Connection=True" 
     Microsoft.EntityFrameworkCore.SqlServer 
     --no-onconfiguring
Run Code Online (Sandbox Code Playgroud)


Ant*_*ton 6

仅供参考-NoOnConfiguring,EF Core 5.0 中有一个选项

-NoOnConfiguring Don't generate DbContext.OnConfiguring. Added in EF Core 5.0.

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/powershell#scaffold-dbcontext

  • 哇,我对此感到非常惊讶。如果你看看 github,他们非常坚决不引入这样的功能,尽管有这么多的请求。看来微软终于开始倾听人们的需求了。 (3认同)

小智 -4

首先。我建议您使用 dotnet core 迁移 cli 来搭建数据库。命令的详细信息可以在这里找到。

使用 dotnet core 迁移 cli,您只需要在 applicationdbcontext 类中定义您的配置,如下所示

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }

    modelBuilder.Entity<User>().HasMany(u => u.Claims).WithOne().HasForeignKey(c => c.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);
    modelBuilder.Entity<User>().HasMany(u => u.Roles).WithOne().HasForeignKey(r => r.UserId).IsRequired().OnDelete(DeleteBehavior.Cascade);

    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Claims).WithOne().HasForeignKey(c => c.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);
    modelBuilder.Entity<ApplicationRole>().HasMany(r => r.Users).WithOne().HasForeignKey(r => r.RoleId).IsRequired().OnDelete(DeleteBehavior.Cascade);

    modelBuilder.EnableAutoHistory(null);

    modelBuilder.Entity<Post>()
        .HasOne(p => p.Medias)
        .WithOne(m => m.Post)
        .HasForeignKey<Media>(p => p.PostId);
}
Run Code Online (Sandbox Code Playgroud)

你只需要像这样在startup.cs文件中定义你的连接

services.AddDbContextPool<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(configuration.GetConnectionString("DefaultConnection"), 
b => b.MigrationsAssembly("AwesomeCMSCore")).UseOpenIddict());
Run Code Online (Sandbox Code Playgroud)

希望我给你说清楚。如果您有任何问题,请告诉我

完整的源代码可以在这里这里找到