Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架、SQLite和延迟加载_C#_.net_Sqlite_Entity Framework 4_Lazy Loading - Fatal编程技术网

C# 实体框架、SQLite和延迟加载

C# 实体框架、SQLite和延迟加载,c#,.net,sqlite,entity-framework-4,lazy-loading,C#,.net,Sqlite,Entity Framework 4,Lazy Loading,嗨,我使用SQL Compact和EF4开发了一个C#Budget应用程序,我通过VS2010实体数据模型模板创建了EF模型。一切都很顺利。不过,我正在考虑开发一款支持现金交易的iPhone应用程序,并认为在这两种平台上都支持后端DB会更好。创建SQLite DB并创建新模型后,我在尝试通过模型中的导航属性访问引用数据时遇到了一个问题。当试图显示被引用表的属性时,我得到一个NullReferenceException 使用以下代码时,我在最后一行得到异常: BudgetEntities budg

嗨,我使用SQL Compact和EF4开发了一个C#Budget应用程序,我通过VS2010实体数据模型模板创建了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列数据的语法错误。我将Guid插入为“7cee3e1c-7a2b-462d-8c3d-82dd6ae62fb4”,而它应该是x'7cee3e1c7a2b462d8c3d82dd6ae62fb4'

希望我在解决这个问题时拔出的头发能长回来:)


感谢大家的参与。

确保BankAccountType属性在Budgetenties中声明为虚拟

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

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


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

我已经尝试过了,但仍然出现相同的错误。预算由VS2010自动生成。我不明白为什么使用SQLCompact数据库、使用自动生成的实体而不是SQLite可以很好地工作。你还有其他建议吗?这两个例子在哪里?网络服务器?控制台应用程序?当您在同一个位置运行两个示例时会发生什么情况?这两个示例在一个简单的控制台应用程序中运行,以尝试确定发生了什么。我尝试将您文章中的代码段添加到第一个示例中,但仍然出现异常。我还检查了account类,它不是动态代理,即使ContextOptions.ProxyCreationEnabled设置为true,ContextOptions.LazyLoadingEnabled也已打开。我已经做了一些进一步的测试,并比较了为SQL Compact DB和SQLite DB创建的.edmx和.designer.cs,它们基本相同,但SQLite似乎没有加载引用的实体。我开始认为这是SQLite的一个局限性。您认为会出现这种情况吗?如果您使用SQLite的提供程序(system.data.SQLite),则SQLite可能会出现一些问题,因为该提供程序以.NET 3.5和EFv1为目标,因此EFv4中的某些功能不必可用。透明延迟加载是EFv4的特性,但我相信它不应该依赖于提供程序,所以它仍然应该像预期的那样与旧的SQLite提供程序一起工作。您可以尝试将Devart的dotConnect用于SQLite,并验证它是否与提供程序有关。