Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I implement DbContext Connection String in .NET Core?

My situation is quite similar to this link or at least my code is similar and I am trying to find a way to apply this same method in .NET Core syntax.

Pass connection string to code-first DbContext

My specific code is as follows:

public partial class CompanyFormsContext : DbContext {     public CompanyFormsContext()         : base("name=CompanyFormsContext")     {     }      public CompanyFormsContext(string connName)         : base("name=" + connName)     {     }     ... } 

I get an error saying:

Error CS1503 Argument 1: cannot convert from 'string' to 'Microsoft.EntityFrameworkCore.DbContextOptions' CompanyForms..NETCoreApp,Version=v1.0

when I go over the parenthesis in base("name=CompanyFormsContext") or base("name=" = connName).

What is the correct way of implementing this functionality in .NET Core?

Edit:

I wanted to share that I have the following information for database connection in my appsettings.json file: (However, I do not have settings in the startup.cs)

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

and I have found the following link Adding DbContextOptions in Startup.cs not registering data store in the website and I am wondering if a simple protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) will be enough to fix my connection or not?

From the link:

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

Do I need this kind of a service in my Startup.cs?

like image 232
Kemal Tezer Dilsiz Avatar asked Aug 10 '16 15:08

Kemal Tezer Dilsiz


People also ask

How do I create a connection string in .NET Core?

ASP.NET Core For instance, you can use the Secret Manager tool to store your database password and then, in scaffolding, use a connection string that simply consists of Name=<database-alias> . Or the following example shows the connection string stored in appsettings. json .

How does DbContext work in .NET Core?

A DbContext instance represents a session with the database and can be used to query and save instances of your entities. DbContext is a combination of the Unit Of Work and Repository patterns. Entity Framework Core does not support multiple parallel operations being run on the same DbContext instance.

Which method is used for adding DbContext class as service?

The AddDbContext extension method registers DbContext types with a scoped lifetime by default.


2 Answers

Another option would be to call the base constructor that takes a DbContextOptions:

public BooksContext(string connectionString) : base(GetOptions(connectionString)) { }  private static DbContextOptions GetOptions(string connectionString) {     return SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder(), connectionString).Options; } 
like image 128
Ricardo Peres Avatar answered Sep 19 '22 18:09

Ricardo Peres


Generally you are going to want to read it from config at start-up, and then use the connection string to configure an Entity Framework DbContext service for your process.

1) Add a line to your appsettings.json:

"DbConnectionString": "Server=s;Database=db;Trusted_Connection=True;", 

2) Read the line in you Startup.cs class (after the Startup method is called to build the Configuration - so usually in the ConfigureServices method) like this:

var connection = Configuration["DbConnectionString"]; 

3) If using Entity Framework add a database context service (MyDbContext is the context class generated by EF). You also want to tell the built-in dependency injection how to instantiate your database context:

services.AddDbContext<MyDbContext>(options => options.UseSqlServer(connection)); services.AddScoped<IMyDbContext, MyDbContext>(); 

Where IMyDbContext is (at it's simplist) just an interface you've extracted from your MyDbContext

4) Now you can define your controller to take a MyDbContext and the DI will take care of building it and passing it in when the controller is invoked:

public MyController(IMyDbContext context) {     _context = context  // store for later use } 
like image 32
Peter Avatar answered Sep 23 '22 18:09

Peter