1. 程式人生 > 程式設計 >.NET Core配置連線字串和獲取資料庫上下文例項

.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")

我們可以直接在上下文的 OnConfGkqyPIDigure 方法裡,配置預設使用的連線字串。

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

但是,極其不www.cppcns.com建議這樣做,一般可能除錯環境或為了方便在裡面這樣做。

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

            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配置連線字串和獲取資料庫上下文例項的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援我們。