我有一个解决方案,里面有几个'项目'。一个是 MVC Web 应用,另一个是类库。
在我的 MVC Web App Startup 中.cs我正在注册 DbContext:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSession();
services.AddHttpContextAccessor();
services.AddMemoryCache();
services.AddSingleton<Controllers.HomeController>();
services.AddRouting(options => options.LowercaseUrls = true);
services.AddDbContext<AffiliateDatabaseContext>();
}
我在类库中设置了所有上下文,并在应用程序设置(工作(中设置了配置连接字符串:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
IConfigurationRoot configuration = new ConfigurationBuilder().SetBasePath(AppDomain.CurrentDomain.BaseDirectory).AddJsonFile("appsettings.json").Build();
optionsBuilder.UseSqlServer(configuration.GetConnectionString("CustomerBilling"));
}
}
我正在尝试在我的类库中的类文件中使用 DBContext,执行 DI:
private static AffiliateDatabaseContext affilContext;
public PromotionLogic(AffiliateDatabaseContext _affilContext)
{
affilContext = _affilContext;
}
public static IEnumerable<AffPromotion> GetAllPromotions()
{
return affilContext.AffPromotion.Include("Company").Include("PromotionType").Include("Audience").Include("PromotionSportLink").Include("AffPromotionImage").OrderBy(x => x.Priority).AsEnumerable();
}
但是affilContext
似乎为空,并且不断收到以下错误:
System.NullReferenceException: 'Object reference 未设置为 对象的实例。
我做错了吗?我需要接口还是其他东西?它似乎在控制器中工作正常。
另一种方法是将DBContext作为参数传递给函数吗?
问题是您正在分配给instance
构造函数中的static
字段。由于您从不调用构造函数,因此该字段将保持null
。解决方案是使用实例字段(无static
(。
因此:
private static AffiliateDatabaseContext affilContext;
必须是:
private AffiliateDatabaseContext affilContext;
进行此更改后,任何使用affilContext
的static
方法都需要更改为非静态(即删除static
(。
您可能想将变量保留为static
。一般来说,对于数据库上下文来说,这不是一个好主意。它们不是为长寿命而设计的,也不是线程安全的。因此static
数据库上下文不适合在 Web 应用程序中使用。