我在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");
});
答案 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将能够自己识别它。