c# - Entity Framework 、SQLite 和延迟加载

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

您好,我使用 SQL Compact 和 EF4 开发了一个 C# 预算应用程序,我通过 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'

希望我通过这个问题拔掉的头发会重新长出来:)

感谢大家的意见。

最佳答案

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

var accoutTypes = budget.BankAccountTypes;

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

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

关于c# - Entity Framework 、SQLite 和延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458395/

相关文章:

c# - 无法生成临时类(结果=1)有什么想法吗?

android - 如何从表中读出两列并将它们相乘?

c# - Gmap.net 标记删除

c# - 如何将图像裁剪成圆形?

时间:2019-03-17 标签:c#javascriptinbrowser

c# - CloudConfigurationManager.GetSetting 在生产中返回空字符串?

c# - 如何正确编写桌面应用程序?

c# - 你如何获得默认用户文件夹(例如 c :\users\Default)

MySQL 到 Sqlite

c# - 重构 session 检查