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

假設數據庫就兩個表: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();

 到此這篇關於.NET Core配置連接字符串和獲取數據庫上下文實例的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: