实体框架核心集User.RoleId不会自动将相关的Role实体关联到user.Role

时间:2019-04-13 15:50:49

标签: c# entity-framework entity-framework-core

我在MySql中使用最新的Entity Framework Core Database First方法。

数据库提供者为

  

Pomelo.EntityFrameworkCore.MySql

所以我认为应该找到所有生成的代码,问题应该在我自己的代码中。

我使用数据库脚手架功能来生成数据库实体类和dataContext类。

有2个表: 用户,角色。

关系:1个用户属于1个角色。

在创建用户时,我传入一个角色ID并将其roleId设置为:

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

我原本希望看到用户。在SaveChanges()之后带有值的角色,但这不会发生。

我想念什么吗?

更新

我尝试通过搜索roleId来检索Role实体,然后将检索到的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为空。

请帮助。

更新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 :(得分:0)

SaveChanges不会填充导航属性。它将填充PrimaryKeys(例如,AutoIncremented整数)和ForeignKeys(如果您在SaveChanges之前设置了导航属性),但是将不会设置导航属性本身。

答案 1 :(得分:0)

我刚发现,这个原因延迟加载

修复是使用 Include()

还有一件事要提及,我使用

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

无论何时在调用SaveChanges()方法之前添加/更新/删除实体。

不确定我是否每次都需要这样做吗?否则EF Core将能够自己识别它。