如何在不使用 Entity Framework 的情况下在 Startup.cs 中添加 DbContext?
How to add DbContext In Startup.cs without using Entity Framework?
我目前正在开发一个 class 库,稍后将作为块包上传,这样如果用户创建 a.NET 核心应用程序,she/he可以下载nugget包并相应使用。
基本上在class 库中,Entity Framework、Nethereum 和其他软件包作为依赖项安装。我的目标之一是不要求用户将 Entity Framework 添加到他们的应用程序中(因为 nugget 包(,即我正在构建的 class 库 ))有没有安装。因此,class 库中有一个 DbContext 接受数据库连接字符串并构建选项。
public class BEFDbContext: DbContext
{
public BEFDbContext(string connectionString) :
base(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options) { }
public DbSet<ApplicationEvent> Events { get; set; }
}
接下来,用户必须在扩展 class 库中找到的 BEFDbContext class 的应用程序代码中创建另一个 class。
public class NewDatabaseContext: BEFDbContext
{
public NewDatabaseContext(string connectionString):base(connectionString){}
}
到目前为止一切顺利,但是,在这一点上,我想 'initialise' NewDatabaseContext class 中的 Startup.cs class。通常,人们会使用 Entity Framework 并添加这样的代码:
services.AddDbContextPool<NewDatabaseContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
});
但是,正如我之前提到的,目标之一是不要求 users/developers 将 Entity Framework 添加到应用程序( 再一次,因为我们在 class图书馆).
所以,我的问题是 如何在不使用 Entity Framework 的情况下将 NewDatabaseContext class 添加为 Startup.cs 中的 DbCcontext?
由于您想要替代响应,您可以使用扩展方法
在您的库中添加以下代码
public static class ServiceCollectionExtensions
{
public IServiceCollection AddApplicationDbContext<T>(this IServiceCollection services, IConfiguration configuration) where T : BEFDbContext
{
services.AddDbContextPool<T>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
});
return services;
}
}
然后在应用程序启动时就可以使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddApplicationDbContext<NewDatabaseContext>(Configuration);
...
}
您可以根据需要对此进行更改。比如接受连接字符串而不是整个配置等等
这个答案使用泛型和扩展方法。如果您想了解更多详情,请查看:
通用方法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods
我目前正在开发一个 class 库,稍后将作为块包上传,这样如果用户创建 a.NET 核心应用程序,she/he可以下载nugget包并相应使用。
基本上在class 库中,Entity Framework、Nethereum 和其他软件包作为依赖项安装。我的目标之一是不要求用户将 Entity Framework 添加到他们的应用程序中(因为 nugget 包(,即我正在构建的 class 库 ))有没有安装。因此,class 库中有一个 DbContext 接受数据库连接字符串并构建选项。
public class BEFDbContext: DbContext
{
public BEFDbContext(string connectionString) :
base(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options) { }
public DbSet<ApplicationEvent> Events { get; set; }
}
接下来,用户必须在扩展 class 库中找到的 BEFDbContext class 的应用程序代码中创建另一个 class。
public class NewDatabaseContext: BEFDbContext
{
public NewDatabaseContext(string connectionString):base(connectionString){}
}
到目前为止一切顺利,但是,在这一点上,我想 'initialise' NewDatabaseContext class 中的 Startup.cs class。通常,人们会使用 Entity Framework 并添加这样的代码:
services.AddDbContextPool<NewDatabaseContext>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
});
但是,正如我之前提到的,目标之一是不要求 users/developers 将 Entity Framework 添加到应用程序( 再一次,因为我们在 class图书馆).
所以,我的问题是 如何在不使用 Entity Framework 的情况下将 NewDatabaseContext class 添加为 Startup.cs 中的 DbCcontext?
由于您想要替代响应,您可以使用扩展方法
在您的库中添加以下代码
public static class ServiceCollectionExtensions
{
public IServiceCollection AddApplicationDbContext<T>(this IServiceCollection services, IConfiguration configuration) where T : BEFDbContext
{
services.AddDbContextPool<T>(options =>
{
options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
});
return services;
}
}
然后在应用程序启动时就可以使用
public void ConfigureServices(IServiceCollection services)
{
...
services.AddApplicationDbContext<NewDatabaseContext>(Configuration);
...
}
您可以根据需要对此进行更改。比如接受连接字符串而不是整个配置等等
这个答案使用泛型和扩展方法。如果您想了解更多详情,请查看:
通用方法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/generic-methods