【问题标题】:Scaffolding Db Context and automatically remove the OnConfiguring method脚手架 Db Context 并自动移除 OnConfiguring 方法
【发布时间】:2017-10-31 06:50:39
【问题描述】:

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

每次我们做脚手架时,都会与所有实体一起生成一个上下文类,它包含 OnConfiguring(..) 方法,该方法调用 optionsBuilder.UseSqlServer(..) 来配置上下文以连接到 SQL 服务器数据库.

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

【问题讨论】:

    标签: c# .net asp.net-core


    【解决方案1】:

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

    -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,尽管提出了所有要求,但他们非常坚决不引入这样的功能。看起来微软终于开始倾听人们的需求了。
    【解决方案2】:

    您要搜索的选项是:--no-onconfiguring

    dotnet ef dbcontext scaffold
        "server=.\SqlExpress;database=MyDb;Trusted_Connection=True" 
         Microsoft.EntityFrameworkCore.SqlServer 
         --no-onconfiguring
    

    【讨论】:

      【解决方案3】:

      首先。我建议您使用 dotnet core migration cli 来搭建您的数据库。指令详情见here

      使用 dotnet core migration 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);
      }
      

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

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

      希望我为您澄清。如果您有任何问题,请告诉我

      完整的源代码可以在herehere找到

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-28
        相关资源
        最近更新 更多