Ändern Sie das Entity Framework-Datenbankschema zur Laufzeit

asp.net c# entity-framework

Frage

In den meisten asp.net-Anwendungen können Sie den Datenbankspeicher ändern, indem Sie zur Laufzeit die Verbindungszeichenfolge ändern. Das heißt, ich kann von der Verwendung einer Testdatenbank zu einer Produktionsdatenbank wechseln, indem Sie einfach den Wert des Felds "Datenbank" in der Verbindungszeichenfolge ändern

Ich versuche, das Schema (aber nicht unbedingt die Datenbank selbst) mit dem Entity-Framework zu ändern, aber kein Glück.

Das Problem, das ich sehe, ist, dass der SSDL-Inhalt in der edmx-xml-Datei das Schema für jedes Entitätsset speichert.

siehe unten

<EntitySet 
    Name="task" 
    EntityType="hardModel.Store.task" 
    store:Type="Tables" 
    Schema="test"  />

Jetzt habe ich den Schemaattributwert vom Test in "prod" geändert und es funktioniert.

Dies scheint jedoch keine gute Lösung zu sein.

  1. Ich muss das evert-Entity-Set sowie gespeicherte Prozeduren aktualisieren (ich habe +50 Tabellen).
  2. Kann ich das nur eine kompilierzeit machen?
  3. Wenn ich später versuche, die bereits vorhandenen Entity-Modellentitäten zu aktualisieren, werden diese gelesen, da EF nicht erkennt, dass die Tabelle bereits im EDM vorhanden ist.

Irgendwelche Gedanken?

Akzeptierte Antwort

Update Beim Lesen Ihrer Kommentare wird deutlich, dass Sie das referenzierte Schema für jede Datenbank und nicht für die Datenbank ändern möchten. Ich habe die Frage bearbeitet, um dies zu klären und das von Ihnen bereitgestellte Beispiel-EDMX wiederherzustellen, das in der ursprünglichen Formatierung ausgeblendet war.

Ich werde meinen Kommentar hier wiederholen:

Wenn sich die Schemata in derselben DB befinden, können Sie diese zur Laufzeit nicht wechseln (außer bei nur EF 4-Code). Dies liegt daran, dass zwei identisch benannte und strukturierte Tabellen in zwei verschiedenen Schemata als völlig unterschiedliche Tabellen betrachtet werden.

Ich stimme auch mit JMarsch oben überein: Ich würde das Design noch einmal überdenken, Test- und Produktionsdaten (oder eigentlich ' irgendetwas und Produktionsdaten') in dieselbe Datenbank zu stellen. Scheint wie eine Einladung zur Katastrophe.

Alte Antwort unten.

Sind Sie sicher, dass Sie die richtige Verbindungszeichenfolge ändern? Die von der EF verwendete Verbindungszeichenfolge ist in die Verbindungszeichenfolge eingebettet, die die Position von CSDL / SSDL / etc angibt. Es ist üblich, eine "normale" Verbindungszeichenfolge zur Verwendung durch einen anderen Teil Ihrer App (z. B. ASP.NET-Mitgliedschaft) zu haben. In diesem Fall müssen Sie beim Ändern von DBs beide Verbindungszeichenfolgen aktualisieren.

Wenn Sie die Verbindungszeichenfolge zur Laufzeit aktualisieren, müssen Sie entsprechend spezielle Tools verwenden , die das Format der EF-Verbindungszeichenfolge verstehen und sich vom üblichen Verbindungszeichenfolgen-Generator unterscheiden. Siehe das Beispiel im Link. Siehe auch diese Hilfe zum Zuweisen von EF-Verbindungszeichenfolgen .


Beliebte Antwort

Ich habe das gleiche Problem und es ist wirklich ärgerlich, weil Microsoft das Boot wirklich vermisst hat. Der halbe Grund für die Verwendung von EF ist die Unterstützung zusätzlicher Datenbanken. Wenn Sie jedoch nicht zuerst Code eingeben, wird das Problem nicht wirklich gelöst.

In MS SQL macht das Ändern des Schemas wenig Sinn, da das Schema Teil der Identität der Tabellen ist. Bei anderen Arten von Datenbanken ist das Schema nicht unbedingt Teil der Datenbankidentität und bestimmt nur den Speicherort der Datenbank. Stellen Sie eine Verbindung zu Oracle her, und die Änderung der Datenbank und das Ändern des Schemas sind im Wesentlichen gleichbedeutend.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum