1

1 つのアプリケーションに結合する必要がある

  1. コンパイル前に DB から EDMX ファイルに生成されたコード
  2. アプリケーション自体によって実行時に生成およびコンパイルされるコード。生成されたコードは CodeFirst を使用して DB にアクセスします。

注: 1. と 2. のコードは、異なる DbContext を持ち、同じデータベースにアクセスしますが、テーブルは異なります。

タイプ 1. と 2. のインスタンスを異なるトランザクション スコープで使用している場合、すべて正常に動作するようです。しかし、それらを 1 つのトランザクション スコープで一緒に使用しようとすると、エラーが発生します (EDMX が最初に呼び出された場合)。

System.Reflection.TargetInvocationException: Exception has been thrown by the ta
rget of an invocation. ---> System.Data.ProviderIncompatibleException: An error
occurred while getting provider information from the database. This can be cause
d by Entity Framework using an incorrect connection string. Check the inner exce
ptions for details and ensure that the connection string is correct. ---> System
.Data.ProviderIncompatibleException: **The provider did not return a ProviderManif
estToken string.** ---> System.Transactions.TransactionException: **The operation is
 not valid for the state of the transaction.**

とエラー (CodeFirst が最初に使用された場合)

System.Data.MetadataException: Schema specified is not valid. Errors:
(0,0) : error 0175: **The specified store provider cannot be found in the configur
ation, or is not valid.**
   at System.Data.Metadata.Edm.StoreItemCollection.Loader.ThrowOnNonWarningErrors()

状況をさらに複雑にするために、これを追加する必要があります。DB がリモート サーバー上にある場合にのみ発生する動作を説明します。ローカル DB を使用している場合、すべて問題ないように見えます。私の疑惑は、分散トランザクションコーディネーターがその役割を果たすことができるということです...

主な質問: 1 つの TransactionScope で EDMX と CodeFirst を組み合わせることは可能ですか。はいの場合、どのように?

どんな助けでも大歓迎です。ミロス島

4

2 に答える 2

0

CodeFirstはクラスに基づいてEDMXを作成し、既存のedmxファイルをロードすることはできません。ただし、データベースからクラスを生成し(EF Power Toolsを使用するなど)、CodeFirstアプリによって生成されたEDMXがロードするEDMXと同じになるようにモデルを構成できます。TransactionScopeはEntityFrameworkで使用できます。表示されるエラーメッセージは、トランザクションスコープではなく、プロバイダーが見つからないか、誤って使用されていることに関連しています。

于 2012-10-12T18:02:22.033 に答える
0

最初にコードを使用して2つの異なるデータベースに保存し、接続文字列が間違っているというエラーが発生したので、これを行ったところうまくいきました....

try
{
    using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        MegaBotExtractorDBContext2 db = new MegaBotExtractorDBContext2();
        MegaBotExtractorDBContext db1 = new MegaBotExtractorDBContext();
        FullUri newUri = new FullUri();
        HostUri NewHostUri = new HostUri { HostUriName = "google10.com" };
        db1.HostUris.Add(NewHostUri);
        db1.SaveChanges();

        using (TransactionScope ts2 = new TransactionScope(TransactionScopeOption.RequiresNew))
        {
            db.FullUris.Add(newUri);
            db.SaveChanges();
            ts2.Complete();
            ts.Complete();
        }
    }
}
catch { }
于 2012-11-06T10:00:29.650 に答える