Отношение один-ко-многим в Entity Framework 4.1: извлекается внешний идентификатор, но сам объект не - PullRequest
0 голосов
/ 23 августа 2011

Я использую Entity Framework 4.1 и пытаюсь создать отношение один ко многим. В моем программном обеспечении у меня есть классы UserEntity и RoleEntity. Каждый пользователь имеет одну роль, но одна роль может иметь много пользователей.

До сих пор мне удалось доставить данные из БД в UserEntity, за исключением связанного объекта RoleEntity. Свойство RoleId моего тестового пользовательского объекта имеет правильный RoleID, но свойство Role равно нулю.

Есть ли какая-то дополнительная конфигурация, которую мне нужно было бы написать до того, как свойство Role будет заполнено правильным RoleEntity?

[Table("Roles")]
public class RoleEntity
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[Table("Users")]
public class UserEntity
{
    public long Id { get; set; }
    public string Password { get; set; }
    public Int32 IsActive { get; set; }

    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public string LocalService { get; set; }

    [ForeignKey("RoleEntity")]
    public long RoleId { get; set; }

    public virtual RoleEntity Role { get; set; }
    public virtual ClientOrganizationEntity ClientOrganization { get; set; }
}

public class UserContext : DbContext
{
    #region Constructor

    public UserContext(DbConfigurationProvider dbConfigurationProvider)
        : base(dbConfigurationProvider.ConnectionString)
    {
        if (dbConfigurationProvider == null)
            throw new ArgumentNullException("dbConfigurationProvider");

        Configuration.ProxyCreationEnabled = false;
    }

    #endregion

    #region DbSets

    public DbSet<UserEntity> Users { get; set; }
    public DbSet<RoleEntity> Roles { get; set; }
    public DbSet<ClientOrganizationEntity> ClientOrganizations { get; set; }

    #endregion
}

Данные в таблице «Пользователи»:

Id Пароль пользователя Имя Фамилия Электронная почта LocalService IsActive RoleId ClientOrganizationId

1 foo 62cdb7020ff920e5aa642c3d4066950dd1f01f4d FirstName Фамилия te@s.t foobar.com 1 1 1

Таблица данных в ролях:

Id Name

1 Администратор

EDIT:

Вот как я получаю данные из DbContext:

var user = _dbContext.Users.FirstOrDefault(x => x.Id == 1);
var role = user.Role;

Ответы [ 3 ]

2 голосов
/ 23 августа 2011

Я не видел, чтобы вы отключили создание прокси в конструкторе

Configuration.ProxyCreationEnabled = false

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

Так что либо включите создание прокси, либо используйте метод Include, чтобы быстро загрузить навигационные свойства

var user = _dbContext.Users.Include(u => u.Role).FirstOrDefault(x => x.Id == 1);
0 голосов
/ 23 августа 2011

Я сам решил это.Для некоторых отключение Configuration.ProxyCreationEnabled разорвало отношения.Единственное изменение, которое я сделал, чтобы исправить это, было удалить эту строку:

Configuration.ProxyCreationEnabled = false;

Конечно, отношения должны быть возможны, даже если отключено создание прокси, поэтому, если у кого-то есть какая-либо дополнительная информация, я хотел бы услышать ее,Однако пока я рад, что проблема была решена.

0 голосов
/ 23 августа 2011

Вам необходимо включить отложенную загрузку Configuration.LazyLoadingEnabled=true; в конструкторе UserContext.

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