1

多数のデータベースがあり、すべて同じスキーマを共有しています。それらは、いくつかのSQL Server、一部の2005、一部の2008に広がっています。最初に次のように述べた2008サーバーに接続した後、2005サーバーに接続すると例外が発生します。

エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。エントリの更新中にエラーが発生しました。詳細については、内部例外を参照してください。使用中のSQLServerのバージョンは、データ型'datetime2'をサポートしていません。

ですから、私が理解しているように、モデルは2008 SQLサーバープロバイダー情報に従って作成されているため、2005サーバーに接続すると、DateTime2データ型はサポートされていないため使用できません。

2005サーバーに対してモデルを構築したいのですが、接続文字列とDbCompiledModelの両方を指定する方法がわかりません。以前は、(他のパラメーターの中でも)接続文字列を受け取るコンストラクターがいくつかありました...

    public ProjectContext(string ConnectionString) : base(ConnectionString)
    {

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // ... does some stuff with the ObjectContext
    }

すべてのコンテキスト(最小公分母)に対して2005サーバーに対して構築されたコンパイル済みモデルを指定し、接続文字列を指定するにはどうすればよいですか?現時点では、それを行う方法がわかりません。

どんな助けでもいただければ幸いです。

編集:Entity Framework 4.3 Code Firstを使用しているため、編集する設計時のEDMXファイルはありません。

4

2 に答える 2

2

基本クラスコンストラクターにはオーバーロードがあります!

OnModelCreating構成を、BuildModelという名前のDbCompiledModelを返す新しいメソッドにコピーしました。ConnectionStringコンストラクターを持つコンストラクターが呼び出されると、dbModelの値を取得します。これは、nullの場合、BuildModelから返された値に設定されるプライベート読み取り専用プロパティです。プロパティ値は、接続文字列とともに基本クラスのコンストラクターに送られます。

接続しているSQLサーバーのバージョンにアクセスできます。最終的にはそれを取り入れて、2005年用と2008年用に1つのモデルを作成します。

これを行うためのより良い方法がある場合に備えて、しばらくの間これを開いたままにしておきます。

public DbContext ProjectContext (string ConnectionString) 
    : base(ConnectionString, dbModel)
{

}

private DbCompiledModel _dbModel;
private DbCompiledModel dbModel;
{
    get
    {
        if (_dbModel == null)
        {
            _dbModel = BuildModel(new DbModelBuilder());
        }
        return _dbModel;
    }
}

    private DbCompiledModel BuildModel(DbModelBuilder builder)
    {
        //Some configuration stuff
        return builder.Build(new DbProviderInfo("System.Data.SqlClient", "2005"))
                      .Compile();
    }
于 2012-09-06T02:51:59.157 に答える
1

最初の質問に答えるには、edmx xmlファイルを直接編集して から、ファイルの上部にある要素のProviderManifestToken属性を2008から2005に変更する必要があります。<Schema>

AFAIKでは、.edmxファイルごとにこれを行う必要があります。さらに悪いProviderManifestTokenことに、EF接続が使用するSQLバージョンに従って、データベースからモデルを更新するたびにモデル更新ウィザードが復元されます。AFAIK EFウィザードは、edmxを含むローカルアセンブリの接続文字列を使用するため、SQL2005DBを指すようにその接続文字列を変更した場合は問題ありません。

于 2012-09-05T15:48:25.593 に答える