1 回答

TA貢獻1829條經驗 獲得超4個贊
這個問題是缺少注冊的,DbContextOption它是初始化目標數據庫上下文所需的構造函數的一部分。
在內部就是這樣RegisterPluginDataContext做的。
/// <summary>
/// Represents extensions of Autofac ContainerBuilder
/// </summary>
public static class ContainerBuilderExtensions
{
? ? /// <summary>
? ? /// Register data context for a plugin
? ? /// </summary>
? ? /// <typeparam name="TContext">DB Context type</typeparam>
? ? /// <param name="builder">Builder</param>
? ? /// <param name="contextName">Context name</param>
? ? public static void RegisterPluginDataContext<TContext>(this ContainerBuilder builder, string contextName) where TContext : DbContext, IDbContext
? ? {
? ? ? ? //register named context
? ? ? ? builder.Register(context => (IDbContext)Activator.CreateInstance(typeof(TContext), new[] { context.Resolve<DbContextOptions<TContext>>() }))
? ? ? ? ? ? .Named<IDbContext>(contextName).InstancePerLifetimeScope();
? ? }
}
DbContextOptions<TContext>請注意,它在激活上下文時嘗試解析。
您需要構建數據庫上下文選項并將其提供給容器,以便在解析時可以將其注入到上下文中。
private const string CONTEXT_NAME ="nop_object_context_bookappointment";
public? void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config) {
? ? //...code removed for brevity
? ? var optionsBuilder = new DbContextOptionsBuilder<BookAppointmentDBContext>();
? ? optionsBuilder.UseSqlServer(connectionStringHere);
? ? DbContextOptions<BookAppointmentDBContext> options = optionsBuilder.Options;
? ? builder.RegisterInstance<DbContextOptions<BookAppointmentDBContext>>(options);?
? ? //data context
? ? builder.RegisterPluginDataContext<BookAppointmentDBContext>(CONTEXT_NAME);
? ? //...code removed for brevity
}
- 1 回答
- 0 關注
- 132 瀏覽
添加回答
舉報