Добавленная сущность кода сначала не загружает свойства с отложенной загрузкой - PullRequest
14 голосов
/ 13 февраля 2012

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

Например:

У меня есть сущность 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 будет загружен с отложенной загрузкой, когда он используется представлением, но это не так, и это приводит к исключению с нулевой ссылкой.

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

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

Среда: сначала используйте Entity Framework 4.2.Ленивая загрузка включена.

Ответы [ 2 ]

20 голосов
/ 13 февраля 2012

Это потому, что метод 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;
}
1 голос
/ 13 февраля 2012

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

context.ContextOptions.LazyLoadingEnabled = false;

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

...