实体框架,SQLite和延迟加载

本文关键字:延迟加载 SQLite 框架 实体 | 更新日期: 2023-09-27 18:33:11

嗨,我

使用 SQL Compact 和 EF4 开发了一个 C# Budget 应用程序,我通过 VS2010 实体数据模型模板创建了 EF 模型。一切都运作良好。但是,我正在考虑开发一个iPhone应用程序来支持现金交易,并认为最好在两个平台上都支持后端数据库。创建 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.
}

这只是一个简单的例子,我知道我可以通过添加.包括("银行帐户类型"(到查询中,但是我还有其他非常复杂的查询,这些查询正在创建对象,其中包括查询中引用对象的属性,我不太确定如何为他们解决这个问题。

编辑:在项目之间休息了一会儿后,我又回到了这个问题,我终于解决了我的问题。它与代码无关。这是数据。我通过转储和加载将 SQL Compact 数据库转换为 SQLite,并且我的 Guid 列数据的语法错误。我将 Guid 插入为"7cee3e1c-7a2b-462d-8c3d-82dd6ae62fb4",而它应该是 x'7cee3e1c7a2b462d8c3d82dd6ae62fb4'

希望我拔掉的头发能重新长出来:)

感谢大家的投入。

实体框架,SQLite和延迟加载

在第二个示例中,您的代码片段以以下内容开头:

var accoutTypes = budget.BankAccountTypes;

这会将所有银行帐户类型加载到应用程序,并且不再需要延迟加载(EF 将自动识别这些实体已加载并修复与银行帐户的关系(。

首先检查您的帐户类是否为动态代理(只需检查调试器中的a类型(。如果不是,您在类定义中犯了一些错误,延迟加载将不起作用。接下来检查是否在上下文实例(budget.ContextOptions.LazyLoadingEnabled属性(上启用了延迟加载。

确保 BankAccountType 属性在预算实体中声明为虚拟。