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