【问题标题】:How to add DbContext In Startup.cs without using Entity Framework?如何在不使用实体框架的情况下在 Startup.cs 中添加 DbContext?
【发布时间】:2021-07-22 02:27:26
【问题描述】:

我目前正在进行一个项目,我正在开发一个类库,稍后将作为 nugget 包上传,这样如果用户创建 .NET Core 应用程序,她/他可以下载 nugget 包并使用相应地。

基本上在类库中,Entity Framework、Nethereum 和其他包作为依赖项安装。我的目标之一是不要求用户将实体框架添加到他们的应用程序中(因为 nugget 包(,即我正在构建的类库))已经安装了它。因此,在类库中有一个接受数据库连接字符串并构建选项的 DbContext。

public class BEFDbContext: DbContext
{
    
    public BEFDbContext(string connectionString) : 
        base(SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options) { }

    public DbSet<ApplicationEvent> Events { get; set; }

}

接下来,用户必须在应用程序代码中创建另一个类,以扩展类库中的 BEFDbContext 类。

public class NewDatabaseContext: BEFDbContext
{        
    public NewDatabaseContext(string connectionString):base(connectionString){}
}

到目前为止一切顺利,但是,在这一点上,我想在 Startup.cs 类中“初始化”NewDatabaseContext 类。通常,人们会使用实体框架并添加这样的代码:

services.AddDbContextPool<NewDatabaseContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("defaultconnection"));
        });

然而,正如我之前提到的,其中一个目标是不要求用户/开发人员将实体框架添加到应用程序中(再一次,因为我们在类库中拥有它)。

所以,我的问题是如何在不使用实体框架的情况下将 NewDatabaseContext 类添加为 Startup.cs 中的 DbCcontext

【问题讨论】:

  • 实体正在使用 dbContext,它是所有数据连接的基类。所以 BulkCopy 会起作用。请参阅:stackoverflow.com/questions/2553545/…
  • 嘿。只是让您知道... Asp Net Core 具有依赖继承,即:如果 nuget 包引用 EntityFramework 那么您的应用程序会自动具有此
  • @IhusaanAhmed 第一个回复,您的意思是我可以使用“常规”方法添加 DbContext 类?这意味着我可以直接使用 BEFDbContext (在类库中)而不是 NewDatabaseContext (在应用程序中)?
  • 抱歉回复晚了,但我想说的是,即使您没有直接将EntityFrameworkCore Nuget 添加到应用程序中,您也可以使用AddDbContextAddDbContextPool,因为那个nuget包将由应用程序从类库“继承”。如果你想要另一种方式,你也可以使用扩展方法。如果你愿意,我可以在答案中告诉你如何做到这一点
  • 只需简单地“指出”我就可以通过继承来做到这一点,但以另一种方式,我可以克服这个问题。感谢您的意见。虽然这是一种替代解决方案,但此处提出的具体问题尚未得到解答。

标签: c# .net entity-framework class-library asp.net-core-5.0


【解决方案1】:

由于您想要替代响应,您可以使用扩展方法

在您的库中添加以下代码

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

扩展方法:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

【讨论】:

  • 非常感谢您的回答,Ihusaan Ahmed。这种方法很有意义,并且按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多