.NET Core 獲取資料庫背景關系實體的方法和配置連接字串
目錄- .NET Core 獲取資料庫背景關系實體的方法和配置連接字串
- ASP.NET Core 注入
- .NET Core 注入
- 無簽名背景關系 OnConfigure 配置
- 有簽名背景關系建構式和自己new一個背景關系
假設資料庫就兩個表: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();
工良比較菜,,,上面有很多原理沒有弄懂,大神看到指定一下我唄~
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/91628.html
標籤:.NET Core
