.NET Core 獲取資料庫上下文實例的方法和配置連接字元串 [TOC] 假設資料庫就兩個表:User、Blogs, 模型類如下 資料庫上下文大致這樣 ASP.NET Core 註入 ASP.NET Core 的資料庫註入是最為簡單方便的了,在 ConfigureServices 配置即可。 然後 ...
目錄
.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();
工良比較菜。。。上面有很多原理沒有弄懂,大神看到指定一下我唄~