私は 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 で接続を開くときは、使用しているデータベースに応じて適切なサーバー名を使用する必要があります。これは単なる開発用のセットアップであるため、大したことではありません。
私の質問:
- これがどこに文書化されているか知っている人はいますか?