0

私は Entity Framework (4.3) とコードを最初に使用しています (SQL サーバー 2012 localdb と共に)。

あるアプリケーションでは呼び出しが結果(「カード」)を返し、別のアプリケーションでは同じデータベース(数千行が利用可能)で同じクエリを使用すると何も返されないという興味深い状況があります(使用しているため、この場合はnullです) FirstOrDefault)。

using (var context = new MyEntities())
        {
            //verify account exists
            var account = context.Account.SingleOrDefault(a => a.AccountNum == accountNum);

            if (account == null)
            {   
                //handle no account                 
                return false;
            }                

            var card = context.cards.FirstOrDefault(c => c.Used == false);

            //check that we actually got a card
            if (card == null)
            { 
                //handle no cards available
                return false;
            }

            card.Used = true;

           //snip...

            context.SaveChanges();
        }

私のテスト コンソール アプリでは「カード」に値がありますが、「サービス」にはありません。同じコード (同じアセンブリでも)、同じデータベース、同じ行が利用可能です。アカウントの取得は、どちらの場合でも機能します。

これを試してみます: EF Code First にデータベースのクエリを強制する方法は?

しかし、それが機能したとしても、一貫性のない動作は私には意味がありません。

編集

指摘されたように、2つのデータベースインスタンスがあります。興味深い部分は、ライブラリがどこから実行されるか (VS11 でのデバッグとして、または管理者ユーザーとして実行されるサービスから) に応じてデータソースが変化することです。これが私のapp.configです:

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
  </parameters>
</defaultConnectionFactory>

コンソール アプリケーションと同じライブラリ (DLL) を実行しているサービス プロセスにアタッチすると、データソースが次のように変更されました。

(localdb)\v11.0

に:

.\SQLEXPRESS

同じ DLL、同じ app.config。名前付きローカル db インスタンスと名前なしローカル db インスタンス、およびそれらが実行されているユーザーについて何かを読んだことを漠然と覚えていますが、現在、Google のスキルでは失敗しています。

したがって、SSMS で接続を開くときは、使用しているデータベースに応じて適切なサーバー名を使用する必要があります。これは単なる開発用のセットアップであるため、大したことではありません。

私の質問:

  • これがどこに文書化されているか知っている人はいますか?
4

1 に答える 1

0

問題は、2 つのデータベースを使用していたことです。サービスの接続文字列を含む実際の実行フォルダーに .config がなかったため、2 つが使用されていました。テストアプリケーションには.configがありました

  <entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
        <parameters>
             <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
        </parameters>
  </defaultConnectionFactory>
  </entityFramework>

サービスはそうではなかったため、既定の動作 (SQL Server の既定のインスタンスに接続しているように見えます) に当てはまりませんでした。

接続が明示的に示されていない場合は、アプリケーションが DB の作成に失敗する (例外をスローする) ほうがよかったのですが、Microsoft によってDbContextの「備考」セクションに記載されています。

接続文字列が見つからない場合、名前は Database クラスに登録されている DefaultConnectionFactory に渡されます。接続ファクトリは、コンテキスト名をデフォルトの接続文字列のデータベース名として使用します。(この既定の接続文字列は、別の DefaultConnectionFactory が登録されていない限り、ローカル コンピューターの .\SQLEXPRESS を指します。)

于 2012-05-30T21:50:20.787 に答える