3

こんにちは、SQL Compact と EF4 を使用して C# Budget アプリケーションを開発しました。VS2010 Entity Data Model テンプレートを使用して EF モデルを作成しました。それはすべて非常にうまく機能しています。しかし、現金取引をサポートする iPhone アプリの開発を検討しており、両方のプラットフォームでバックエンド DB をサポートする方がよいと考えました。SQLite DB を作成して新しいモデルを作成した後、モデルのナビゲーション プロパティを介して参照データにアクセスしようとしたときに問題が発生しました。参照されているテーブルのプロパティを表示しようとすると、NullReferenceException が発生します。

次のコードを使用すると、最後の行で例外が発生します。

BudgetEntities budget = new BudgetEntities();
var accounts = budget.BankAccounts.ToList();

foreach (BankAccount a in accounts)
{
    Console.WriteLine("Name:" + a.Description);
    Console.WriteLine("Number:" + a.AccountNumber);
    Console.WriteLine("Type:" + a.BankAccountType.AccountType); //Exception occurs here.
}

奇妙なことに、この例では例外が発生しません。何が起こっているのかわかりませんか?

BudgetEntities budget = new BudgetEntities();
var accoutTypes = budget.BankAccountTypes;

var account = new BankAccount();
account.ID = Guid.NewGuid();
account.AccountTypeID = accoutTypes.First(t => t.AccountType.StartsWith("Credit")).ID;
account.BSB = "3434";
account.AccountNumber = "32323";
account.Description = "Test";
account.TrackingAccount = true;

budget.AddObject("BankAccounts", account);
budget.SaveChanges();
var accounts = budget.BankAccounts.ToList();

foreach (BankAccount a in accounts)
{
    Console.WriteLine("Name:" + a.Description);
    Console.WriteLine("Number:" + a.AccountNumber);
    Console.WriteLine("Type:" + a.BankAccountType.AccountType); //Exception doesn't happen.
}

これは単純な例にすぎず、クエリに .Include("BankAccountTypes") を追加することで修正できることはわかっていますが、参照されたオブジェクトのプロパティをクエリに含むオブジェクトを作成する非常に複雑な他のクエリがあり、彼らのためにこの問題を回避する方法がよくわかりません。

編集: プロジェクト間で休憩した後、私はこの問題に戻ってきて、ようやく問題を解決しました。コードとは何の関係もありませんでした。データ付きでした。ダンプとロードを介して SQL Compact データベースを SQLite に変換したところ、Guid 列データの構文が間違っていました。x'7cee3e1c7a2b462d8c3d82dd6ae62fb4' であるはずの Guid を '7cee3e1c-7a2b-462d-8c3d-82dd6ae62fb4' として挿入していました。

この問題を解決して抜いた髪がまた生えてくることを願っています:)

ご意見をお寄せいただきありがとうございます。

4

2 に答える 2

2

2番目の例では、コードスニペットは次のように始まります。

var accoutTypes = budget.BankAccountTypes;

これにより、すべての銀行口座タイプがアプリケーションに読み込まれ、遅延読み込みは不要になります(EFは、これらのエンティティが既に読み込まれていることを自動的に認識し、銀行口座との関係を修正します)。

まず、アカウントクラスが動的プロキシであるかどうかを確認します(aデバッガーでタイプを確認するだけです)。そうでない場合は、クラス定義に誤りがあり、遅延読み込みは機能しません。budget.ContextOptions.LazyLoadingEnabled次に、コンテキストインスタンス(プロパティ)で遅延読み込みが有効になっているかどうかを確認します。

于 2012-05-05T08:38:02.300 に答える
0

BankAccountType プロパティが BudgetEntities で virtual として宣言されていることを確認してください。

于 2012-05-05T05:17:51.060 に答える