使用以下实体:
用户 .cs:
public class User {
[Key]
public Guid Id { get; set; }
public List<Session> Sessions { get; set; }
}
会话 .cs:
public class Session
{
[Key]
public Guid Id { get; set; }
public Guid UserId { get; set; }
public User User { get; set; }
}
ApiContext .cs:
public class ApiContext : DbContext
{
public ApiContext(DbContextOptions<ApiContext> options) : base(options)
{
Database.EnsureCreated();
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Added to try to fix the issue
modelBuilder.Entity<User>().HasMany(u => u.Sessions).WithOne(u => u.User);
}
public DbSet<User> Users { get; set; }
public DbSet<Session> Sessions { get; set; }
}
然后创建一个会话:
var newSession = new Session
{
User = someUser
};
Db.Sessions.Add(newSession);
在获得会话后:
var session = apiContext.Sessions.SingleOrDefault(s => s.id == wantedUid);
session.UserId
设置正确且有效,但是session.User
是null
。
根据我的理解,上下文应根据session.User
自动设置session.UserId
。
正如代码中指出的那样,尽管它应该是自动的,但我还是尝试显式添加HasMany
约束。(见docs)。
为什么会发生这种情况,我该如何解决? Guid
ID类型是否搞砸了?
答案 0 :(得分:0)
该问题是由于对EF Core的“急切加载”策略不了解所致。
根据these docs的提示,只会自动填充先前加载到上下文中的属性。当我们在每个请求上重新创建上下文并且之前没有在该特定上下文上加载User
时,它不会自动出现在Session
上。
因此,解决方案非常简单:
var session = apiContext.Sessions.SingleOrDefault(s => s.id == wantedUid)
.Include(s => s.User);