/// <summary> /// 添加上下文,自动识别数据库驱动 /// </summary> /// <typeparam name="TDbContext">上下文</typeparam> /// <param name="services">服务集合</param> /// <param name="optionsAction">操作委托</param> /// <returns>返回已添加上下文服务集合</returns> public static IServiceCollection AddDestinyDbContext <TDbContext>(this IServiceCollection services, Action <IServiceProvider, DbContextOptionsBuilder> optionsAction = null) where TDbContext : DbContextBase { services.AddDbContext <TDbContext>((provider, builder) => { var type = typeof(TDbContext); var settings = provider.GetAppSettings(); if (settings == null) { MessageBox.Show("配置不存在!!"); } DestinyContextOptions contextOptions = settings.DbContexts?.Values.FirstOrDefault(o => o.DbContextType == type); if (contextOptions is null) { MessageBox.Show($"无法找到{type.Name}数据库配置信息!!"); } var databaseType = contextOptions.DatabaseType; //if (databaseType == Destiny.Core.Flow.Entity.DatabaseType.SqlServer) //每个类型都要判断。可以使用一个接口,每种类型实现自己的,根据数据类型得到相关驱动,使用(策略模式?工厂模式??) //配合注入完美 //{ //} var drivenProviderType = services.GetImplementationTypes <IDbContextDrivenProvider>() ?.FirstOrDefault(o => o.GetAttribute <DatabaseTypeAttribute>()?.DatabaseType == databaseType); if (drivenProviderType == null) { MessageBox.Show($"没有找到{databaseType}类型的驱动实例"); } var drivenProvider = (IDbContextDrivenProvider)provider.GetService(drivenProviderType); if (drivenProvider == null) { MessageBox.Show($"没有找到{databaseType}类型的驱动"); } DestinyContextOptionsBuilder optionsBuilder1 = new DestinyContextOptionsBuilder(); optionsBuilder1.MigrationsAssemblyName = contextOptions.MigrationsAssemblyName; var connectionString = contextOptions.ConnectionString; if (contextOptions.ConnectionString.IsFile(".txt")) //txt文件 { connectionString = provider.GetFileText(contextOptions.ConnectionString, $"未找到存放{databaseType.ToDescription()}数据库链接的文件"); } builder = drivenProvider.Builder(builder, connectionString, optionsBuilder1); optionsAction?.Invoke(provider, builder); }); return(services); }
public DbContextOptionsBuilder Builder(DbContextOptionsBuilder builder, string connectionString, DestinyContextOptionsBuilder optionsBuilder) { builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(optionsBuilder.MigrationsAssemblyName)); return(builder); }
public DbContextOptionsBuilder Builder(DbContextOptionsBuilder builder, string connectionString, DestinyContextOptionsBuilder optionsBuilder) { builder.UseMySql(connectionString, new MySqlServerVersion(new Version(8, 0, 23)), opt => opt.MigrationsAssembly(optionsBuilder.MigrationsAssemblyName)); return(builder); }