Dynamisch ändern die Verbindungszeichenfolge in Asp.Net Kern
Möchte ich ändern, sql-Verbindungszeichenfolge im controller, nicht in ApplicationDbContext. Ich bin mit Asp.Net Kern-und Entity Framework-Kern.
Beispiel:
public class MyController : Controller {
private readonly ApplicationDbContext _dbContext
public MyController(ApplicationDbContext dbContext)
{
_dbContext = dbContext;
}
private void ChangeConnectionString()
{
//So, what should be here?
} }
Wie kann ich dies tun?
Dauerhaft oder vorübergehend für die Dauer der Anfrage?
temporäre, während der Laufzeit der controller.
temporäre, während der Laufzeit der controller.
InformationsquelleAutor Yurii N. | 2016-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben wir einen Fall ähnlich wie du. Was wir getan haben, ist das implementationfactory überlastung der IServiceCollection in der ConfigureServices Methode der Start - Klasse, etwa so:
Es ist sehr schwierig für mich jetzt zu implementieren CreateApplicationDbContext für Sie, weil es ganz darauf an, was Sie genau möchten. Aber wenn Sie bemerkt haben, dass ein Teil aus, wie Sie wollen, es zu tun genau das, die Grundlagen der Methode sollte so Aussehen sowieso:
Sobald dies implementiert ist, können Sie Spritzen die richtige ApplicationDbContext in Ihrem controller, wie Sie es in den Konstruktor:
Oder einer action-Methode im controller:
Allerdings implementieren Sie die details, der trick ist, dass die Durchführung Fabrik bauen Ihre ApplicationDbContext jedesmal, wenn man es injizieren.
Sagen Sie mir, wenn Sie weitere Hilfe benötigen die Implementierung dieser Lösung.
Update #1
Yuriy N. gefragt, was ist der Unterschied zwischen AddTransient und AddDbContext, das ist eine berechtigte Frage... Und es ist nicht. Lassen Sie mich erklären.
Dies ist nicht relevant für die ursprüngliche Frage.
ABER... gesagt, dass die Umsetzung Ihrer eigenen "implementation Fabrik" (das ist die wichtige Sache zu beachten über meine Antwort) kann in diesem Fall mit entity framework ein bisschen komplizierter als das, was wir brauchten.
Jedoch mit Fragen wie diesen können wir heutzutage zum Glück Blick auf den Quellcode auf GitHub, also schaute ich nach, was AddDbContext macht genau das. Und gut... Dass ist nicht wirklich schwierig. Diese 'Beurteilung' und 'verwenden') extension-Methoden sind nichts anderes als convenience-Methoden, denken Sie daran, dass. So müssen Sie alle Dienste, die AddDbContext hat, plus den Optionen. Vielleicht kann man Sie sogar wiederverwenden AddDbContext Erweiterung Methode, fügen Sie einfach Ihre eigenen überlastung mit der Realisierung der Fabrik.
Also, um auf Ihre Frage zurückzukommen. AddDbContext hat einige EF-spezifische Sachen. Wie Sie sehen können, Sie gehen, um Ihnen zu erlauben, zu passieren, ein Leben lang in einer späteren Version (transient, singleton). AddTransient ist Asp.Net Kern, die können Sie fügen Sie alle service, die Sie brauchen. Und Sie müssen eine Implementierung Fabrik.
Macht es klarer?
DbContext
mitAddTransient
? Was ist der Unterschied zwischen dieser Methode hinzufügen undservices.AddEntityFramework().AddSqlServer().AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]))
? Und mit Ihrer Methode, die wir verloren Migrationen von der Konsole, oder etwa nicht?Ich aktualisiert meine Antwort eine Reaktion auf Sie. Hoffe, es hilft. 🙂
Es ist wirklich hilfreich, danke! Aber immer noch unklar, was sollen wir tun, mit Migrationen?
ApplicationDbContext
nichtDbContext
, so dass Migrationen von der console nicht funktionieren.Was meinst du damit? ApplicationDbContext sollten/könnten noch Erben von DbContext, richtig? Vielleicht versuchen Sie die Lösung implementieren. Sehen Sie, wie weit Sie bekommen können. Dann post eine neue Frage auf, SO, und wir werden Ihnen weiter helfen. 🙂
ja, Sie haben Recht, lassen Sie uns versuchen, um die Lösung implementieren.
InformationsquelleAutor Danny van der Kraan
War ich in der Lage, ändern Sie die Verbindungszeichenfolge für jede Anforderung durch verschieben der Verbindungs-string-Logik in der
OnConfiguring
Methode der DbContext.In
Startup.cs#ConfigureServices
Methode:services.AddDbContext<MyDbContext>();
In MyDbContext.cs habe ich noch die Dienste, die ich brauchte, injiziert, um den Konstruktor.
Dann überschreiben OnConfiguring:
Müssen Sie Ihre Injektion in
ConfigureServices()
so etwas wie dieses:services.AddTransient<IHttpContextAccessor , HttpContextAccessor >()
. Wichtig, injizieren Sie, bevor SieaddDbContext()
.wenn ich services hinzufügen.AddDbContext<MyDbContext>(), es ruft nur den default-Konstruktor von MyDbContext Klasse ist die öffentlichkeit MyDbContext (){ }. vor dem Aufruf dieser, ich hv bereits injiziert httpcontext.
Wenn ich mich nicht Irre, man sollte keine Standard-Konstruktor, Konstruktor nur mit eingespritzt Dienstleistungen, die Sie benötigen.
wie tun Sie tatsächlich an Ihrem Verbindungs-string in den Konstruktor, nämlich "your connection string Logik hier" ist nicht gut genug, ich will nicht, dass meine Logik da zu sein, ich will, dass mein connection-string festgelegt werden, bevor Kontext bauen
InformationsquelleAutor jhr
Dies ist genug, wenn Sie wählen Sie eine Verbindungszeichenfolge, die pro http-Anforderung, basierend auf der aktiven http-request-Parameter.
Sie nicht haben einfachen Zugang zu den Benutzer allerdings noch seine Ansprüche. Es sei denn, du hast manuell.
Wie zu extrahieren und Holen Sie sich ein Anspruch aus dem token?
optionsAction: An optional action to configure the DbContextOptions for the context. This provides an alternative to performing configuration of the context by overriding the OnConfiguring(DbContextOptionsBuilder) method in your derived context.
...[OnConfiguring()] is called for each instance of the context that is created
InformationsquelleAutor ginalx
Dass die Arbeit für mich:
InformationsquelleAutor jcmordan
Den Antworten von @ginalx und @jcmordan passen meine Anforderungen perfekt. Die Sache ich mag über diese Antworten, dass ich es tun kann, alles in
Startup.cs
und halten alle anderen Klassen reinigen von Bau-code. Ich will supply ein optionales querystring-parameter, um eine Web-Api Anfrage und haben diese ersetzt in der Basis-Verbindungszeichenfolge erstellt, die den DbContext. Ich halten die base-string in der App.json-format und es auf der Grundlage der übergebenen parameter oder einen Standardwert, wenn keine geliefert, ich.e:Letzten
ConfigureServices
Methode für mich aussieht (obvs. Ich bin die Verbindung zu DB2 nicht SQL, aber das ist nebensächlich):InformationsquelleAutor Ciaran