.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。
推薦閱讀:
- .NET Core使用EF生成數據庫出錯的解決方法
- Entity Framework Core延遲加載(懶加載)用法
- Asp.Net Core中創建多DbContext並遷移到數據庫的步驟
- 淺析.net core 拋異常對性能影響
- EF Core通過顯式編譯提高查詢性能