实体框架,SQLite和Lazy加载

时间:2012-05-05 02:47:31

标签: c# .net sqlite entity-framework-4 lazy-loading

您好我使用SQL Compact和EF4开发了一个C#Budget应用程序,我通过VS2010实体数据模型模板创建了EF模型。这一切都很好。但是我正在考虑开发一个支持现金交易的iPhone应用程序,并认为在两个平台上都支持后端数据库会更好。创建SQLite数据库并创建新模型后,我在尝试通过模型中的导航属性访问引用数据时遇到了问题。尝试显示引用表的属性时,我收到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列数据的语法错误。我将Guid插入'7cee3e1c-7a2b-462d-8c3d-82dd6ae62fb4'时应该是x'7cee3e1c7a2b462d8c3d82dd6ae62fb4'

希望我解决这个问题的头发会重新长出来:)

感谢大家的意见。

2 个答案:

答案 0 :(得分:2)

在第二个示例中,您的代码段以:

开头
var accoutTypes = budget.BankAccountTypes;

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

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

答案 1 :(得分:0)

确保在BudgetEntities中将BankAccountType属性声明为virtual。