Проблема с Entity Framework и отложенной загрузкой - PullRequest
2 голосов
/ 13 декабря 2010

Я использую Entity Framework 4 и у меня несколько проблем с отложенной загрузкой. У меня есть 3 объекта, и каждый из них содержится друг в друге. CarSetup будет содержать сущность Car, которая будет содержать сущность Event. Они все лениво загружены.

Я создал упрощенный модульный тест для воспроизведения проблемы.

CarSetup carSetup = carSetupContext.CreateObject<CarSetup>();
Car car = Load("car1");
carSetup.Car = car;

Я получаю аварию, когда назначаю машину объекту carsetup. На самом деле происходит сбой в методе Equals объекта Car.

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

    return this.Event.Equals(((Car)obj).Event);
}

Если я быстро просмотрю сущность до вызова метода equals, все подчиненные сущности будут загружены, и проблема не возникнет.

Когда я назначаю существующую машину для настройки машины, платформа загружает все существующие CarSetups для этой машины и вызывает у них мой метод "Equals" Однако, поскольку отложенная загрузка включена, Событие в автомобиле является нулевым, что является нормальным. Когда он пытается получить доступ к свойству Event, загрузка НЕ ​​происходит и происходит сбой. Я проверил свойство "this" в методе equals, и оно имеет тип "System.Data.Entity.DynamicProxies.Car". Я также проверил, и EventId Guid правильно установлен в сущности автомобиля.

Кто-нибудь имеет представление о том, что происходит?

РЕДАКТИРОВАТЬ: после выполнения еще большего тестирования, если я вызову метод равных вручную:

car.Equals(car);

Все работает отлично. Это происходит только тогда, когда Entity Framework решает загрузить отношения и автоматически вызывает метод Equals.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2010

Вы, кажется, используете объекты POCO с включенными DynamicProxies в контексте вашего объекта, верно? Возможно, что при приведении obj к Car в переопределении Equals вы приведете к классу 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 голосов
/ 13 декабря 2010

Кажется, что Event не загружается.По памяти я бы сделал что-то вроде этого, чтобы убедиться, что события загружены с автомобилями:

context.Cars.Include("Events");

Вы используете синтаксис, с которым я не знаком, но посмотрите на Includeоператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...