Добавленный код-первый объект не обладает ленивыми свойствами

У меня проблема, когда свойство только что добавленного объекта не загружается, если требуется сразу после добавления объекта.

Например:

У меня есть объект User с виртуальным свойством JobRole:

public class User
{
    public int Id { get; set; }

    public virtual JobRole JobRole { get; set; }
    public int JobRoleId { get; set; }

    public string Name { get; set; }
}

Затем я добавляю нового пользователя:

public User Add(User user)
{
    var addedUser = _myContext.Users.Add(user);
    myContext.SaveChanges();
    return addedUser;
}

Возвращенная ссылка на нового пользователя затем передается в представление Razor, где он пытается отобразить JobRole (например, JobRole.Name). В тот момент, когда Пользователь передается в представление, он имеет:

  • JobRoleId правильно задан для целочисленного значения.
  • JobRole = null

Тогда я ожидал бы, что JobRole будет лениво загружен при использовании View, но это не так и приведет к исключению с помощью NULL-ссылки.

Является ли это ожидаемым поведением или есть способ получить добавленные объекты для ленивой загрузки своих свойств?

Заранее благодарим за любые идеи.

Окружающая среда: Использование Entity Framework 4.2 в коде. Lazy-load enabled.

Ответы

Ответ 1

Это потому, что метод DbSet.Add возвращает тот же объект, который был передан ему как аргумент, который в вашем случае не является экземпляром прокси, следовательно, ленивая загрузка не доступно.

Вам следует создать объект User, который передается DbSet.Add с помощью DbSet.Create, который вернет экземпляр прокси, а затем назначит его свойства, прежде чем продолжать его через DbContext.

Вот пример:

public User Add(User user)
{
    var newUser = _myContext.Users.Create();

    // Copy the property values from 'user' to 'newUser' e.g.
    // newUser.Name = user.Name

    _myContext.Users.Add(newUser);
    myContext.SaveChanges();

    return newUser;
}

Ответ 2

Вы можете попробовать две вещи, первая - принудительная загрузка:

context.ContextOptions.LazyLoadingEnabled = false;

Если это не сработает, вы можете загрузить свойство следующим образом: http://msdn.microsoft.com/en-us/library/dd382880.aspx