如何在.NET Core中实现DbContext连接字符串?

Kem*_*siz 26 .net c# asp.net entity-framework

我的情况与此链接非常相​​似,或者至少我的代码类似,我试图找到一种方法在.NET Core语法中应用相同的方法.

将连接字符串传递给代码优先的DbContext

我的具体代码如下:

public partial class CompanyFormsContext : DbContext
{
    public CompanyFormsContext()
        : base("name=CompanyFormsContext")
    {
    }

    public CompanyFormsContext(string connName)
        : base("name=" + connName)
    {
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说:

错误CS1503参数1:无法从'string'转换为'Microsoft.EntityFrameworkCore.DbContextOptions'CompanyForms..NETCoreApp,Version = v1.0

当我翻过括号base("name=CompanyFormsContext")base("name=" = connName).

在.NET Core中实现此功能的正确方法是什么?

编辑:

我想分享我在appsettings.json文件中有关于数据库连接的以下信息:(但是,我在startup.cs中没有设置)

  "Data": {
    "CompanyFormsContext": {
      "ConnectionString": "Server=(localdb)\\projectsv13;Database=companyforms;Trusted_Connection=True;"
    },
    "CompanyFormsContextQA": {
      "ConnectionString": "Server=(localdb)\\projectsv13;Database=companyforms;Trusted_Connection=True;"
    }
  }
Run Code Online (Sandbox Code Playgroud)

我发现以下链接在Startup.cs中添加DbContextOptions没有在网站上注册数据存储,我想知道一个简单的protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)是否足以修复我的连接?

从链接:

services.AddEntityFramework(Configuration)
    .AddSqlServer()
    .AddDbContext<MyDbContext>(
        options =>
        options.UseSqlServer(Configuration.Get("Data:CompanyFormsContext:ConnectionString"))
    );
Run Code Online (Sandbox Code Playgroud)

我的Startup.cs中是否需要这种服务?

Ric*_*res 34

另一种选择是调用带有DbContextOptions的基础构造函数:

public BooksContext(string connectionString) : base(GetOptions(connectionString))
{
}

private static DbContextOptions GetOptions(string connectionString)
{
    return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果需要获取强类型的`DbContextOptions&lt;TContext&gt;`,则需要使用`new DbContextOptionsBuilder&lt;BooksContext&gt;`。 (5认同)
  • Microsoft 没有为 Oracle 提供一个,您需要使用第三方。根据它的不同,扩展方法可能会有所不同。请参阅 https://docs.microsoft.com/en-us/ef/core/providers/。 (2认同)

Pet*_*ter 16

通常,您希望在启动时从config读取它,然后使用连接字符串为您的进程配置Entity Framework DbContext服务.

1)在appsettings.json中添加一行:

"DbConnectionString": "Server=s;Database=db;Trusted_Connection=True;",
Run Code Online (Sandbox Code Playgroud)

2)读取Startup.cs类中的行(在调用Startup方法构建配置之后 - 通常在ConfigureServices方法中),如下所示:

var connection = Configuration["DbConnectionString"];
Run Code Online (Sandbox Code Playgroud)

3)如果使用Entity Framework添加数据库上下文服务(MyDbContext是EF生成的上下文类).您还想告诉内置依赖项注入如何实例化数据库上下文:

services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connection));
services.AddScoped<IMyDbContext, MyDbContext>();
Run Code Online (Sandbox Code Playgroud)

IMyDbContext(简单来说)就是你从MyDbContext中提取的一个接口

4)现在你可以定义你的控制器来获取MyDbContext,DI将负责构建它并在调用控制器时传入它:

public MyController(IMyDbContext context)
{
    _context = context  // store for later use
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*lin 9

一个简单的方法是,只需使用选项生成器来获取上下文:

    public static MyDbContext GetMyDbContext(string databaseName)
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();

        optionsBuilder.UseSqlServer($@"Data Source=.\SqlExpress;Initial Catalog={databaseName};Integrated Security=True");

        return new MyDbContext(optionsBuilder.Options);

    }
Run Code Online (Sandbox Code Playgroud)


Tim*_*hko 7

IMO最佳做法:

添加到您的configuration.json中

     "ConnectionStrings": {
    "BooksContext": "Server=MyServer;Database=MyDb;Trusted_Connection=True;"
  }
Run Code Online (Sandbox Code Playgroud)

初始化部分:

services.AddDbContext<BooksContext>(options => options.UseSqlServer(configuration.GetConnectionString(nameof(BooksContext))));
Run Code Online (Sandbox Code Playgroud)