2010-12-13 96 views
2

我正在使用实体框架4,并且有一些延迟加载的问题。 我有3个实体,每个都包含在另一个中。 Carrepup将包含一个Car实体,它将包含一个Event实体。他们都被懒加载。实体框架和延迟加载的问题

我创建了一个简单的单元测试来重现问题。

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方法之前快速查看实体,所有子实体都会加载并且不会发生问题。

当我将现有汽车分配给汽车设置时,框架加载该汽车的所有现有汽车设置,并调用我的“Equals”方法。但是,由于启用了延迟加载,Car中的事件为空,这是正常的。当它试图访问Event属性时,不会发生加载并且崩溃。我已经在equals方法中检查了“this”属性,它的类型是“System.Data.Entity.DynamicProxies.Car”。我也检查过并且EventId Guid在汽车实体中正确设置。

任何人有任何想法发生了什么?

编辑:

car.Equals(car); 

一切完美:做了一些更多的测试,如果我把我的equals方法manualy后。只有在实体框架决定加载关系并自动调用Equals方法时才会发生。

感谢

+0

有出错了作为回报的括号......等于方法。可能只是一个错字,因为这甚至没有编译,也不能成为你问题的原因。 – Slauma 2010-12-13 18:55:51

+0

谢谢你指出。我的实体稍微复杂一些,所以我没有真正注意到这个问题。 – autoexec 2010-12-14 08:35:45

回答

0

看来,Event没有被加载。从内存中我会做这样的事情,以确保事件被装入汽车:

context.Cars.Include("Events"); 

您使用一种语法,我不熟悉,但考虑了Include操作。

+0

对于语法,加载部分仅仅是一个例子。如果我将“包含”添加到我的选择查询中,是否不会因为整个事件将在初始查询中加载而导致延迟加载的目的?如果我尝试在加载后访问该属性,则我的延迟加载适用于该事件。它只在那个似乎不起作用的奇怪的“平等”情景中。 – autoexec 2010-12-13 12:45:27

0

您似乎在您的对象上下文中使用了启用DynamicProxies的POCO对象,对吧?有可能在您的等值覆盖中将obj转换为Car您投到您的POCO类而不是System.Data.Entity.DynamicProxies.Car,这是从Car动态派生的。通过该演员阵容,您可以有效剥离obj(可能也是类型System.Data.Entity.DynamicProxies.Car,如this)延迟加载导航属性的能力。 (因为它是DynamicProxy使POCO实体的延迟加载。)

现在的问题是,你无法投射到System.Data.Entity.DynamicProxies.Car而不是Car因为这种类型没有在编译时存在,只是在运行时动态生成。

但是,如果您使用的是C#4.0(Visual Studio 2010),则可以尝试使用新的dynamic关键字进行动态输入。你的Equals重写应该是这样的:

public override bool Equals(object obj) 
{ 
    if(obj == null) 
    { 
     return false; 
    } 

    dynamic o = obj; 

    return this.Event.Equals(o.Event); 
} 

(。这一切都是射进黑暗的,我没有测试任何东西,但它可能是值得一试)

+0

感谢您的回答。值得一试,但我得到同样的问题。实际上问题比这更大,因为传递给函数的“this”car对象和obj car对象都是DynamicProxies,并且都具有Event属性null。我在做了更多测试之后在我的初始文章中添加了一条评论。该方案似乎只在框架调用我的Equals方法时发生。当我手动调用它时它工作正常。 – autoexec 2010-12-14 08:45:49

+0

是的,我期待'obj'是一个DynamicProxy。但是,当EF调用Equals方法时,似乎这些代理不会加载导航属性。嗯,我不知道了。也许最好在EF的MS开发人员中心再次提出您的问题:http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/threads,也许在此处链接到此主题。 – Slauma 2010-12-14 10:43:05

相关问题