EF Core DbContext
Microsoft.EntityFrameworkCore.DbContext klasse. Het is deze klasse (of, beter gezegd, de klassen die jij maakt op basis van deze klasse) die de toegangspoort tot de database is en alle methoden biedt die je nodig hebt om met de database te werken.DbContext
Voordat een klassemodel kan worden gebruikt om een query op een database uit te voeren, moet Entity Framework weten hoe het code (klassen, eigenschappen, en instanties) heen en weer moeten vertalen van C# naar SQL (in het bijzonder, tabellen, kolommen en rijen ). Daarvoor gebruikt het ORM of object relational mapping.
Een context is een klasse die erft van DBContext en die een aantal entiteit-collecties toegankelijk maakt in de vorm van DbSet<T> eigenschappen.
DbContext gebruiken met dependency injection
EF ondersteunt DbContext met een dependency injection container. Je kan het DbContext type toevoegen aan de service container door gebruik te maken van AddDbContext<TContext>.
AddDbContext maakt en voegt een een DbContext type, TContext, en DbContextOptions<TContext> toe, die dan beschikbaar is in de service container voor injectie.
Meer over Dependency injection.
- voeg de connectiestring toe appsettings.json:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=mmt;Trusted_Connection=True; MultipleActiveResultSets=true", "MmtLocal": "Server=92.222.220.213,1500;Database=_13875_JefInghelbrecht; User Id=sa;Password=xxxxxxxx;MultipleActiveResultSets=true", "Mmt": "Server=510.380.377.150;user id=Docent1;password=Docent_XXXXXX;port=3306; database=Docent1;SslMode=none" } } - De DBContext wordt geconfigureerd in Startup.cs waar de connectiestring ingelezen wordt uit het appsettings.json configuratiebestand. De
GetConfigurationmethode haalt de waarde op die overeenkomt met de sleutelConfiguration:<connection string name>. - In de Startup klasse moet je verwijzen naar de namespace waarin de
DbContextklasse, die voor de database toegang gebruikt, staat:using FricFrac.Models.FricFrac;
- Evenals naar:
using Microsoft.EntityFrameworkCore;
- De naam van de
DbContextklasse, die door scaffolding werd genereerd is de naam van de database. Als je een andere naam wilt geven, verander je de naam vanDbContextklasse en van de namespace in dat bestand.
De naam van die DBContext klasse bestaat uit de naam van de database gevolgd door Context. In ons voorbeeld is datdocent300Context. Voor jullie zal datuserXXXzijn. We wijzigen de naam van de klasse en beginnen de naam met een hoofdletter zoals dat volgens afspraak in .NET moet zijn, namelijk klassenamen worden in pascalnotatie geschreven. In Visual Studio kan je de naam automatisch laten wijzigen zodat je zelf niet moet gaan opzoeken waar je die naam hebt gebruikt:
Visual Studio Naming rule violation dialog box - Dan voeg je
DbContextvan je app toe aan de injection container:// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddSingleton<PostcodeApp.Dal.IPostcode> (p => new PostcodeApp.Dal.PostcodeXml(new PostcodeApp.Bll.Postcode())); services.AddTransient(p => new Controllers.PostcodeController(new PostcodeApp.Dal.PostcodeXml())); services.AddDbContext<Docent300Context>(options => options.UseMySQL(Configuration.GetConnectionString("FricFracRemote"))); } - Als je nog geen instantie hebt van de
Configurationklasse moet je die nog eerst nog builden op basis vanappsettings.json:namespace FricFrac { public class Startup { public IConfigurationRoot Configuration { get; } public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); Configuration = builder.Build(); - Verwijder de volgende regel. Ik heb die regel in commentaar gezet zodat je kunt zien welke regel ik bedoel:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. // optionsBuilder.UseMySql("server=164.132.231.13;user id=docent300;password=XXXXXX; port=3306;database=docent300;SslMode=none"); } } - Voeg een constructor argument toe aan je
DbContexttype dat eenDbContextOptionaanvaardt:public Docent300Context(DbContextOptions<Docent300Context> options) : base(options) { }