当前位置: 首页 > 编程语言 > C#

实体框架核心1.0连接字符串分享

时间:2023-04-10 13:15:44 C#

实体框架核心1.0连接字符串我们正在开发一个不同的大型ASP.NETCoreMVC1.0应用程序。我们每个应用程序都有如下4层:DTORepository(entityframework-codefirst)Services(businesslogic)MVC(UI-MVC)当前,在处理所有数据库操作的repository中,我们有一个DbContext中的数据库连接字符串硬编码如下:protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){optionsBuilder.UseSqlServer("DataSource=somedatabase.database.windows.net;InitialCatalog=database;IntegratedSecurity=False;UserID=username;Password=password;Connect超时=60;加密=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;MultipleActiveResultSets=true”);该项目作为独立的ASP.NETCore1.0项目驻留在MVC项目之外。它还有一个空的Program.cs文件,这似乎是执行数据库命令行代码所必需的(dotnetefmigrationsadd和dotnetefdatabaseupdate)。我们在DbConext中使用硬编码连接字符串的原因是,当我们使用下面的代码时,我们会在执行dotnetef命令时得到一个未设置为对象异常的对象引用实例。protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){optionsBuilder.UseSqlServer(ConfigurationManager.ConnectionStrings["StandardDatabase"].ConnectionString);但是,由于我们有一个Program.cs,如果我们为连接字符串添加Debug.WriteLine并运行项目,它会返回正确的连接字符串,如果我们在UI的appsettings.json文件中设置连接字符串,UI也将连接成功。问题:上面提到的堆栈是我们用于几个“微应用程序”的堆栈,这意味着我们有几个连接到多个数据库的项目。我们还想利用Development、Staging和Production连接字符串。如果我们使用ConfigurationManager连接字符串,日常操作一切正常;然而,当我们想为数据库命令行使用EntityFrameworks代码时,我们需要进入每个要更新的存储库,并将DbContext更改为硬编码连接字符串、执行命令,然后更改变得非常麻烦他们完成后回来。问题:我们只是做错了吗,是否有构建实体框架核心1.0堆栈的首选做法,使我们不必手动更改DbContext而充分利用配置文件?任何方向将不胜感激!EFCore旨在通过依赖注入进行配置。依赖注入使您的DbContext保持干净并独立于环境的实现细节。您对连接字符串进行硬编码的初始解决方案将DbContext与数据库所在位置的知识紧密耦合。这显然是个问题。但是,您提出的解决方案将DbContext与特定配置文件的知识紧密结合在一起。这也是一个问题。要使DbContext独立于环境细节,请创建一个构造函数,该构造函数采用DbContextOptions参数并调用基类构造函数。publicclassMyContext:DbContext{publicMyContext(DbContextOptionsoptions):base(options){}}执行此操作而不是覆盖OnConfiguring。然后在主机应用程序的Startup.cs中对其进行初始化。这就是配置文件的知识所在。公共类Startup{私人IConfigurationRoot_configuration;publicStartup(IHostingEnvironmentenv){_configuration=newConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json").Build();}publicvoidConfigureServices(IServiceCollectionservices){services.AddSingleton(_configuration);services.AddDbContext(options=>options.UseSqlServer(_configuration.GetConnectionString("MyContext")));现在您可以从任何地方使用您的DbContext。回答:实际上,我的生活比实际情况要困难得多。我按照Juunas的建议将以下代码添加到我的RepositoryDbContext类中:AddJsonFile("appsettings.json").Build();//定义要使用的数据库optionsBuilder.UseSqlServer(config.GetConnectionString("StandardDatabase"));这与dotnetef命令行工具完美配合,而且我的MVCUI在我的startup.c中坚持使用以下默认代码以进行多环境设置。varbuilder=newConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json",可选:true,reloadOnChange:true).AddJsonFile($"appsettings.{env.EnvironmentName}.json",可选:true).AddJsonFile("project.json",可选:true,reloadOnChange:true);IDbContextFactory也可能有帮助。EF命令行工具和DI可以使用这个工厂来创建DBContext的实例。设计时服务(例如,迁移)将在与派生上下文相同的程序集中找到此接口的实现。以上就是C#学习教程:实体框架核心1.0连接字符串分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——usingMicrosoft.EntityFrameworkCore;使用Microsoft.EntityFrameworkCore.Infrastructure;命名空间MyProject{publicclassBloggingContextFactory:IDbContextFactory{publicBloggingContextCreate(){varoptionsBuilder=newDbContextOptionsBuilder();optionsBuilder.UseSqlite("文件名=./blog.db");返回新的BloggingContext(optionsBuilder.Options}s);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: