2

コンテキストの作成中に接続文字列が作成される dbContext があり、その情報の一部に基づいてテーブル名をマップしたい場合....そのデータをテーブルマッピングに渡すにはどうすればよいですか? 例えば:

private object createContext(string name, string country)
{
    DbConnectionstringbuilder conn = new DbConnectionstringbuilder();
    conn.Add("Provider", "System.Data.SqlClient");
    conn.ConnectionString = string.Format(name, "dbName_" + country + "_moreName");   
    //maybe an if/else since we will say there are more names and countries
    return new object(conn.ToString());
}

dbcontext を初期化すると、次のようになります。

public class object : DbContext
{
    public object(string conn):base(conn)
    {
        DbDatabase.SetInitializer<object>(null);
    }
//insert dbset and mapping config calls here
}

ここで、テーブルを "table_" + country + "_endtablename" のようにマップしたいと考えています。そのデータをマッピング呼び出しに渡すにはどうすればよいと思いますか?

これらのテーブルは、この形式を使用する既存のデータベースにマップされます。国は実際にはログインしているユーザーの資格情報から来ているため、場所などに基づいています。後者で作成された dbcontext の基本クラスへの内部コンストラクターである国コードにアクセスする方法を見つける必要があります。

4

1 に答える 1

0

ええと...私はあなたのDbContextクラスにファクトリメソッドを作成し、サポートしたい国ごとに派生したDbContextクラスを実装します。これにより、国ごとにデータベース初期化機能をカスタマイズできるようになります。派生した具象DbContextはすべて同じ抽象親を使用するため、親としてキャストして使用することができます。イニシャライザでは、流暢なマッピングを使用してデータベース名を設定し、必要なテーブル名をマッピングできます。EF Code Firstの利点は、標準のOOパターン(ファクトリメソッドなど)を使用して、説明したような問題を解決できることです。

ただし、テーブルの命名スキームを再考することをお勧めします。あなたがこれを難しいと思っている理由は、それがやや珍しい設定だからです。ビジネスルールを適用するのは非常に難しいため、エンドユーザーは通常、データベース内のテーブルに対して直接クエリを実行することはありません。各データベースのテーブルに国コード名を付ける必要があるという技術的な理由がない限り、私は技術にテーブルの命名スキームを推進させ、顧客にエンドユーザーエクスペリエンスを推進させます。国別のデータベース名で十分だと思います。これにより、データの分離が実現しますが、コーディングがはるかに簡単になり、1つのデータベース用に作成されたクエリが他のデータベースで機能するようになります。

于 2011-09-30T19:00:05.253 に答える