Базовый набор Entity Framework User.RoleId не связывает автоматически связанный объект Role с пользователем. - PullRequest
1 голос
/ 13 апреля 2019

Я использую последний подход Entity Framework Core Database First с MySql.

Поставщик базы данных:

Pomelo.EntityFrameworkCore.MySql

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

Я использую функцию лесов базы данных для генерации моих классов сущностей базы данных и класса dataContext.

Есть2 таблицы: Пользователь, Роль.

Отношение: 1 пользователь принадлежит 1 роли.

При создании пользователя я передаю идентификатор роли и устанавливаю его roleId, например:

user.RoleId = roleId;
db.SaveChanges();

Я ожидал увидеть user.Role со значением после SaveChanges (), но этого не происходит.

Я что-то упустил?

Обновление

Я попытался извлечь сущность Role, выполнив поиск по roleId, а затем назначил извлеченную сущность Role для user.Role и сохранил:

var role = GetRoleById(user.RoleId);
user.Role = role ?? throw new AppException("User Role is not found");

Пока что после SaveChanges () изатем в следующий раз, когда запрос API приходит кизвлеките пользователя, пользователь все еще имеет значение только в user.RoleId, но user.Role имеет значение null.

Пожалуйста, помогите.

Обновление 2

Класс пользователя:

        modelBuilder.Entity<User>(entity =>
        {
            entity.ToTable("user");

            entity.HasIndex(e => e.ApartmentId)
                .HasName("user_apartment_fk_idx");

            entity.HasIndex(e => e.RoleId)
                .HasName("roleId");

            entity.Property(e => e.Id)
                .HasColumnName("id")
                .HasColumnType("varchar(36)");

            entity.Property(e => e.RoleId)
                .HasColumnName("roleId")
                .HasColumnType("varchar(36)");

            entity.HasOne(d => d.Role)
                .WithMany(p => p.User)
                .HasForeignKey(d => d.RoleId)
                .HasConstraintName("user_ibfk_1");
        });

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Я только что понял, это причина - это Ленивая загрузка .

исправление - это использование Включить () .

Еще одна вещь, которую стоит упомянуть, я использую

_context.Entry(user).State = EntityState.Added;
_context.Entry(user).State = EntityState.Modified;
_context.Entry(user).State = EntityState.Deleted;

всякий раз, когда добавляю / обновляю / удаляю сущность до вызова метода SaveChanges ().

Не уверен, нужно ли мне делать это каждый раз?Или EF Core сможет распознать его сам.

0 голосов
/ 13 апреля 2019

SaveChanges не заполняет свойства навигации. Он заполнит PrimaryKeys (например, AutoIncremented integer) и ForeignKeys (если вы установили свойства навигации до SaveChanges), но сами свойства навигации не будут установлены.

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