我正在使用Entity Framework 4,并且在延迟加载方面遇到了一些问题。 我有3个实体,每个实体都包含在一起。 CarSetup将包含一个将包含Event实体的Car实体。他们都是懒惰的。
我创建了一个简单的单元测试来重现问题。
CarSetup carSetup = carSetupContext.CreateObject<CarSetup>();
Car car = Load("car1");
carSetup.Car = car;
当我将汽车分配给carsetup对象时,我遇到了崩溃。它实际上在Car实体的Equals方法中崩溃。
public override bool Equals(object obj)
{
if(obj == null)
{
return false;
}
return this.Event.Equals(((Car)obj).Event);
}
如果我在调用equals方法之前快速监视实体,则会加载所有子实体并且不会发生问题。
当我将现有汽车分配给汽车设置时,框架会加载该汽车的所有现有CarSetup并使用它们调用我的“Equals”方法。但是,由于启用了延迟加载,因此Car中的Event为null,这是正常的。当它尝试访问Event属性时,不会发生加载并且崩溃。我在equals方法中检查了“this”属性,它的类型为“System.Data.Entity.DynamicProxies.Car”。我还检查了并且在汽车实体中正确设置了EventId Guid。
任何人都知道发生了什么事?
编辑:在做了一些测试之后,如果我手动调用我的equals方法:
car.Equals(car);
一切都很完美。它仅在实体框架决定加载关系并自动调用Equals方法时发生。
由于
答案 0 :(得分:0)
似乎没有加载Event
。从内存中我会做这样的事情来确保事件加载汽车:
context.Cars.Include("Events");
您使用的是我不熟悉的语法,但请查看Include
运算符。
答案 1 :(得分:0)
您似乎在对象上下文中使用了启用了DynamicProxies的POCO对象,对吧?有可能通过在您的等于覆盖中将obj
转换为Car
,您可以转换为POCO类,而不是System.Data.Entity.DynamicProxies.Car
来自Car
的{{1}}。通过该演员,您可以有效地剥离obj
(可能类似于System.Data.Entity.DynamicProxies.Car
类型this
)来延迟加载导航属性。 (因为它是支持延迟加载POCO实体的DynamicProxy。)
现在的问题是你不能转换为System.Data.Entity.DynamicProxies.Car
而不是Car
,因为这种类型在编译时不存在,只能在运行时动态生成。
但是,如果您使用的是C#4.0(Visual Studio 2010),则可以尝试使用新的dynamic
关键字进行动态输入。您的等于覆盖将如下所示:
public override bool Equals(object obj)
{
if(obj == null)
{
return false;
}
dynamic o = obj;
return this.Event.Equals(o.Event);
}
(这一切都是在黑暗中拍摄的,我没有测试任何东西。但它可能值得一试。)