こんにちは、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' として挿入していました。
この問題を解決して抜いた髪がまた生えてくることを願っています:)
ご意見をお寄せいただきありがとうございます。