22

同一のスキーマを持つ 50 のデータベースをホストするサーバーがあり、次のバージョンで Entity Framework の使用を開始したいと考えています。

これらのデータベースごとに新しい接続は必要ありません。1 つの接続の特権で 50 のデータベースすべてと通信できます。データ管理と速度 (これは WebAPI アプリケーションです) のために、各データベースと通信するたびに新しい EF コンテキストをインスタンス化する必要はありません。もちろん、リクエストがサーバーに届くたびにこれが発生する場合を除き、大したことはありません。

本当に必要なのは、USE [データベース名] コマンドを変更する機能だけです。このコマンドは、最終的に EF からサーバーに送信されると想定しています。

コードでこれを達成する方法はありますか? EF は、SaveChanges() などを呼び出す前にオンザフライで変更できるデータベース名を参照する Context で読み取り/書き込みプロパティを維持しますか??

ありがとうございました!!!

ボブ

4

7 に答える 7

14

頑張らないで、賢く働こう!!!!

MYContext localhostContext = new MYContext();
MYContext LiveContext = new MYContext();
//If your databases in different servers
LiveContext.Database.Connection.ConnectionString = LiveContext.Database.Connection.ConnectionString.Replace("localhost", "Live");
//If your databases have different Names
LiveContext.Database.Connection.ConnectionString = LiveContext.Database.Connection.ConnectionString.Replace("DBName-Localhost", "DBName-Live");

データベースの構造は同じでなければなりません;)

于 2015-04-15T21:01:51.237 に答える
5

とてもシンプルです

私が持っていた

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in web.config also the name of EntityFramework
{
}

edmx フォルダーの自動生成された Model.Context.cs に既にあります。

実行時に複数のデータベースに接続するために、同じファイル Model.Context.cs で以下のように接続文字列をパラメーターとして受け取る別のコンストラクターを作成しました

public WMSEntities(string connStringName)
            : base("name=" + connStringName)
{
}

ここで、たとえば Web.Config に他の接続文字列を追加しました

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/>

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/>

次に、データベースに接続するときに、以下のメソッドを呼び出して、connectionString 名をパラメーターとして渡します

public static List<v_POVendor> GetPOVendorList(string connectionStringName)
{

   using (WMSEntities db = new WMSEntities(connectionStringName))
   {               
       vendorList = db.v_POVendor.ToList();
   }
}
于 2014-01-03T01:59:23.953 に答える
1

データベース名を変更するだけの私の解決策は次のとおりです。web または app.config ファイルから文字列を取得して変更し、インスタンス化するだけです。

        string yourConnection = ConfigurationManager.ConnectionStrings["MyEntities"].ConnectionString.Replace("MyDatabase", yourDatabaseName);
        dcon = new MyEntities(yourConnection);
于 2015-07-07T16:03:38.127 に答える
0

これを現在のプロジェクトに実装しました。このプロジェクトでは、プロジェクト内のすべてのクライアントに対して共通のセキュリティ データベースと異なるデータベースを使用しています。したがって、セキュリティ データベースには、他のすべてのデータベースの接続文字列を含むテーブルがあります。クライアント ID を渡して、クライアント データベースの接続文字列を取得するだけです。

このために、共通データベース用に 1 つ、共通スキーマ データベース用に 2 つの EDMX を追加します。ユーザーがログインするとき、またはデータベースを選択するシナリオが何であるかは、共通データベースに移動し、接続文字列を取得して、必要なデータベースのオブジェクトを作成します。これがコードサンプルです。質問があれば教えてください..

他のすべてのデータベースで共有される共通データベース内のテーブルに、他のすべてのデータベースに関する接続文字列を保持できます。

EntityInstance_ReviewEntities.GetContext(GetConnectionString(ClientId));


private string GetConnectionString(int TenantId)
        {
            EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
            ISecurityRepository objSecurity = new SecurityRepository();
            string tenantConnectionString = objSecurity.GetClientConnectionString(TenantId);
            entityBuilder.ProviderConnectionString = tenantConnectionString;
            entityBuilder.Provider = "System.Data.SqlClient";
            entityBuilder.Metadata = @"res://*/ClientEntity.YourEntity.csdl|res://*/ClientEntity.ADBClientEntity.ssdl|res://*/ClientEntity.YourEntity.msl";
            return entityBuilder.ToString();
        }
于 2013-09-17T11:24:18.000 に答える
0

EntityConnection.ChangeDatabase メソッドはサポートされていませんが、SqlConnection.ChangeDatabase は正常に動作します。

したがって、エンティティ フレームワーク データベースのコンストラクターで SqlConnection を使用する必要があります。

using MvcMyDefaultDatabase.Models;
using System.Data.Metadata.Edm;
using System.Data.SqlClient;
using System.Data.EntityClient;
using System.Configuration;
using System.Reflection;

    public ActionResult List(string Schema)
    {
        SqlConnection sqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);

        MetadataWorkspace workspace = new MetadataWorkspace(new string[] { "res://*/" }, new Assembly[] { Assembly.GetExecutingAssembly() });

        EntityConnection entityConnection = new EntityConnection(workspace, sqlConnection);

        sqlConnection.Open();

        sqlConnection.ChangeDatabase(Schema);

        Models.MyEntities db = new MyEntities(entityConnection);

        List<MyTableRecords> MyTableRecordsList = db.MyTableRecords.ToList();

        return View(MyTableRecordsList);
    }

このコードを使用すると、「スキーマ」文字列でデータベース名を渡すいくつかのスキーマの同じ形式 (同じテーブル名と同じフィールド) でテーブルを読み取ることができます。

于 2014-07-09T15:35:17.177 に答える