gpt4 book ai didi

asp.net-core - .Net Core 将连接字符串传递给 DBContext 类

转载 作者:行者123 更新时间:2023-12-01 11:24:12 24 4
gpt4 key购买 nike

刚开始使用 .Net Core 并面临将连接字符串信息传递给 Context 控制台项目。

我有 4 个项目,使用 .Net Core 创建。

  • MVC
  • 服务层
  • 域层
  • 数据层

  • 在 MVC 项目中,我有 Startup.cs 文件,我正在读取 appsettings.json 文件
        public void ConfigureServices(IServiceCollection services)
    {
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);

    services.AddMvc();

    // Add appsettings
    services.Configure<AppSettingsConfig>(Configuration.GetSection("AppSettings"));
    }


    public Startup(IHostingEnvironment env)
    {
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();

    if (env.IsDevelopment())
    {
    // This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
    builder.AddApplicationInsightsSettings(developerMode: true);
    }
    Configuration = builder.Build();
    }

    在我的第四个项目(数据层)中,该控制台项目并具有以下 DBContext 类。这个项目没有我 MVC 项目所拥有的 Startup.cs。 VS 2015 默认不创建。
    public class MyDWContext : DbContext
    {
    public MyDWContext() : base ()
    {

    }

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


    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    optionsBuilder.UseSqlServer(@"Data Source=localhost;Initial Catalog=MyDW; Persist Security Info = False; User ID = TempUser; Password = Temp123");
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Class> Classs { get; set; }
    }

    我也去过其他帖子,但我相信它是使用旧版本或 RC 版本创建的。所以有时我找不到正确的对象或 .Net 类。

    由于我在 MVC 项目中有连接字符串,我如何在 MVC 调用数据层期间使用连接字符串。

    我也有 Web.API(核心)项目,并且有自己的连接字符串(连接字符串中的不同用户配置,只有读取访问权限)。当我从 Web2.API 项目进行调用时,如何使用 Web2.API 连接字符串。

    最佳答案

    而不是将连接字符串传递给 DbContext , 配置 DbContextStartup.cs (如果可能的话)是更好的方法。见官方docs了解如何配置DbContext并通过依赖注入(inject)使用它。

    编辑:下面的代码不是好方法

    但是,如果您想将连接字符串传递给 DbContext您可以使用 options pattern .

    这是一个如何使用选项模式传递连接字符串的示例:

    首先,您需要一个可从数据层和 MVC 层访问的选项类

    public class ConnectionStringOption
    {
    public string ConStr { get ; set; }
    }

    然后设置选项值
    public void ConfigureServices(IServiceCollection services)
    {
    services.AddOptions();
    services.Configure<ConnectionStringOption>(options=>
    {
    // set connection string from configuration
    options.ConStr = Configuration.GetConnectionString("Default");
    });
    }
    appsetting.json
    {
    "ConnectionStrings": {
    "Default": "<your connection string>"
    }
    }

    最后 DbContext
        private readonly IOptions<ConnectionStringOption> _conStrOptions;

    protected YourDbContext()
    {
    }
    public YourDbContext(IOptions<ConnectionStringOption> conStrOptions, DbContextOptions options)
    : base(options)
    {
    _conStrOptions= conStrOptions;
    }

    以另一种方式编辑

    使用静态服务定位器可能是一个解决方案:

    创建 DependencyResolver在数据层
    public static class DependencyResolver
    {
    private static IServiceProvider _provider;
    public static IServiceProvider ServiceProvider
    {
    get
    {
    return _provider;
    }
    set
    {
    if(_provider == null)
    {
    _provider = value;
    }
    }
    }
    }

    ConfigureServices方法
        public void ConfigureServices(IServiceCollection services)
    {
    // other stuff
    services.AddOptions();
    services.Configure<ConnectionStringOption>(options=>
    {
    // set connection string from configuration
    options.ConStr = Configuration.GetConnectionString("Default");
    });
    DependencyResolver.ServiceProvider = services.BuildServiceProvider();
    }

    最后得到选项:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    var conStr = DependencyResolver.ServiceLocator.GetService<IOptions<ConnectionStringOption>>().Value.ConStr;
    optionsBuilder.UseSqlServer();
    }

    以前的愚蠢方式的最终编辑
    public static class ConnectionStringGetter
    {
    public static string ConStr{get;set;}
    }

    public Startup(IHostingEnvironment env)
    {
    //...
    Configuration = builder.Build();
    ConnectionStringGetter.ConStr = Configuration.GetConnectionString("Default");
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    optionsBuilder.UseSqlServer(ConnectionStringGetter.ConStr);
    }

    关于asp.net-core - .Net Core 将连接字符串传递给 DBContext 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39090206/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com