日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

.NET?Core配置連接字符串和獲取數據庫上下文實例_實用技巧

作者:癡者工良 ? 更新時間: 2022-04-03 編程語言

假設數據庫就兩個表:User、Blogs,

模型類如下

    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Number { get; set; }
        public string Email { get; set; }
    }
    
    public class Blogs
    {
        public int Id { get; set; }
        public string BolgName { get; set; }
        public string Url { get; set; }
    }

數據庫上下文大致這樣

    public class DataContext : DbContext
    {
        public DataContext()
        {
        }

        public DataContext(DbContextOptions<DataContext> options) : base(options)
        {
        }

        public DbSet<User> Users { get; set; }
        public DbSet<Blog> Blogs { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);
        }

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

        /*
         * 其他實現
         */
    }

ASP.NET Core 注入

ASP.NET Core 的數據庫注入是最為簡單方便的了,在 ConfigureServices 配置即可。

            services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));

然后在控制器等地方使用,不需要什么多余代碼。

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly DataContext _context;

        public WeatherForecastController(DataContext context)
        {
            _context = context;
        }
     }

.NET Core 注入

需要安裝一個 Nuget 包

Microsoft.Extensions.DependencyInjection

創建一個類?ContextService,用來配置注入和獲取上下文。

    public class ContextService
    {
        /// <summary>
        /// 配置各種服務
        /// </summary>
        /// <returns></returns>
        public static IServiceProvider ServiceProvider()
        {
            IServiceCollection services = new ServiceCollection();

            services.AddDbContext<DataContext>(options => options.UseSqlite("filename=Database.db"));
            var serviceProvider = services.BuildServiceProvider();
            return serviceProvider;
        }

        /// <summary>
        /// 獲取上下文
        /// </summary>
        /// <param name="services"></param>
        /// <returns></returns>
        public static DataContext GetContext(IServiceProvider services)
        {
            var sqliteContext = services.GetService<DataContext>();
            return sqliteContext;
        }

        /// <summary>
        /// 獲取上下文
        /// </summary>
        public static DataContext GetContext()
        {
            var services = ServiceProvider();
            var sqliteContext = services.GetService<DataContext>();
            return sqliteContext;
        }
    }

需要使用時可以這樣獲取上下文

            var context = ContextService.GetContext();
            var list = context.Users.ToList();

無簽名上下文 OnConfigure 配置

上面兩個示例中,連接字符串都是使用 Action<DbContextOptionsBuilder> optionsAction?來配置的。

options => options.UseSqlite("filename=Database.db")

我們可以直接在上下文的 OnConfigure 方法里,配置默認使用的連接字符串。

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            
#if DEBUG
            optionsBuilder.UseSqlite("filename=Database.db");
#endif
        }

但是,極其不建議這樣做,一般可能調試環境或為了方便在里面這樣做。

這種情況是上下文存在一個無簽名構造函數時,外界使用此構造函數直接實例化上下文。

            var context = new DataContext();
            var list = context.Users.ToList();

這種情況下,是直接實例化上下文,并且使用默認的連接字符串。

OnConfiguring會在無注入、也沒有使用有簽名構造函數時才會生效,或者描述為多種配置上下文方式中優先級最低。

有簽名上下文構造函數和自己new一個上下文

上下文必須具有?DbContextOptions?或 DbContextOptions<T>?的構造函數,建議使用泛型形式。

構造函數示例:

        public DataContext(DbContextOptions<DataContext> options) : base(options)
        {
        }

具有此構造函數,則可以通過外界注入配置,例如

            services.AddDbContext<DataContext>(options=>options.UseSqlite("filename=Database.db"));

如果你不使用注入(Microsoft.Extensions.DependencyInjection)或者第三方 ioc 工具,那么無法使用上面這種形式。

不過可以自己 new,自己傳遞配置對象,

            var optionsBuilder = new DbContextOptionsBuilder<DataContext>();
            optionsBuilder.UseSqlite("filename=Database.db");
            DataContext context = new DataContext(optionsBuilder.Options);
            var list = context.Users.ToList();

原文鏈接:https://www.cnblogs.com/whuanle/p/11908663.html

欄目分類
最近更新