.NET Core配置連線字串和獲取資料庫上下文例項
阿新 • • 發佈:2022-01-23
假設就兩個表: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配置連線字串和獲取資料庫上下文例項的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援我們。