使用C#,.NET 4.5.2,实体框架6.1.3和System.Linq我遇到了一个令人困惑的异常。这个例外本身似乎并没有包含有用的信息来确定它为什么会被提出。EF6 NullReferenceException与任何ToList()
下面的代码线被执行时在一个NullReferenceException结果: dbCtx.Customers.ToList();
然而,以下行运行没有异常和返回正确的结果: (dbCtx.Customers).ToList();
运行括号包围表达第一将使两种形式无一例外地执行:
var result1 = (dbCtx.Customers).ToList();
var result2 = dbCtx.Customers.ToList();
我也想说明一下牛逼增加实体按预期工作:
dbCtx.Customers.Add(new Customer() { Enabled = true, Name = "Test" });
Customer实体类:
public sealed class Customer : BaseEntity
{
public bool Enabled { get; set; }
[Required]
public string Name { get; set; }
}
BaseEntity类:
public abstract class BaseEntity
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
}
的DbContext类:
public class MyDbContext : DbContext
{
public MyDbContext() : base(@"Server=.\SQLExpress;Database=MyDatabase;Trusted_Connection=Yes;")
{
Configuration.LazyLoadingEnabled = true;
}
public virtual DbSet<Customer> Customers { get; set; }
}
怎么可能会导致这种行为?
编辑: 当任何实体如.ToList(),.Count()等被调用时发生此问题。
异常详细信息:
System.NullReferenceException occurred
HResult=0x80004003
Message=Object reference not set to an instance of an object.
Source=EntityFramework
StackTrace:
at System.Data.Entity.Internal.Linq.InternalSet`1.get_Expression()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Expression()
at MyProjTests.Test1.Test(MyDbContext dbCtx) in E:\ProgrammingProjects\WorkInProgress\MyProjRoot\MyProjTests\Test1.cs:line 51
at MyProjTests.Test1.TestMethod1() in E:\ProgrammingProjects\WorkInProgress\MyProjRoot\MyProjTests\Test1.cs:line 43
编辑2:
实验我已经将范围缩小到一个呼叫dbCtx.Database.CompatibleWithModel(bool)
后。所提供的论证是真是假都没有区别。当我将它评论出来后,在代码中稍后会引发NullReferenceException。我不知道为什么。调用dbCtx.Database.Exists()
工作正常。 另外,dbCtx.Database.Initialize(false);
也可靠地产生错误(不是在callsite上,而是在xyz.ToList()上)。
哪里了异常的堆栈跟踪表明,它实际上是被抛出?它似乎相当棘手,无论如何,这可能是有趣的知道。此外,如果您不允许延迟加载,问题是否会持续存在? – jmcilhinney
@jmcilhinney我已经更新了异常细节的问题。将延迟加载设置为false仍然会得到相同的结果。 –
也许这是因为'客户'被'密封',EF正试图创建一个更改跟踪代理,并且它失败了?看到这个答案https://stackoverflow.com/a/5599270/235671 – t3chb0t