[英]ASP.NET Core Testing - get NullReferenceException when initializing InMemory SQLite dbcontext in fixture
[英]Initializing DBContext in Asp.Net Core
public MyDbContext(DbContextOptions<MyDbContext> options)
您的MyDbContext
類中沒有空的構造函數,因此您應該在構造函數中傳遞參數DbContextOptions<MyDbContext> options
。
例如你可以看到它 -> link1
您可以像這樣初始化您的數據庫上下文:
var optionBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionBuilder.UseSqlServer("Server=localhost;...");
var context = new MyDbContext(optionBuilder.Options);
以前的代碼是配置連接的options
,然后使用這些選項創建MyDbContext
。
例如,如果您想使用InMemoryDatabase
進行單元測試,您可以將其更改為:
var optionBuilder = new DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase("testindDB")`;
您不應該實例化 DbContext,您應該將它作為構造函數參數請求到您的存儲庫。 然后您的 IOC 容器將在運行時提供 DbContext。 這確保您可以在整個給定的 ASP.NET Web 請求中使用相同的 DbContext,這將防止您可能會遇到的許多問題。
您可以在此處查看通用存儲庫的示例: http : //deviq.com/repository-pattern/
在 ASP.NET 應用程序中通常也不需要單獨的工作單元(但有時需要)。 這是因為您的請求應該非常小,並且您應該能夠在單個控制器或服務中完成大部分工作,然后只需通過存儲庫進行保存。 並不是說您永遠不需要 UoW,而是它比胖客戶端場景(例如 Windows 應用程序或服務)中的必要性要低。
你可以試試:在你的班級 UnitOfWork
private MyDBContext _context;
public UnitOfWork(MyDBContext context)
{
_context = context;
}
在您的控制器中:
private UnitOfWork _unitOfWork;
public MoviesController(MyDBContext context)
{
_unitOfWork = new UnitOfWork(context);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.