实体框架和延迟加载的问题

时间:2010-12-13 10:27:49

标签: c# entity-framework

我正在使用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方法时发生。

由于

2 个答案:

答案 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);
}

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