为什么我的实体关系没有解决?

时间:2018-09-24 18:30:24

标签: c# asp.net-core entity-framework-core npgsql

使用以下实体:

用户 .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.Usernull

根据我的理解,上下文应根据session.User自动设置session.UserId
正如代码中指出的那样,尽管它应该是自动的,但我还是尝试显式添加HasMany约束。(见docs)。

为什么会发生这种情况,我该如何解决? Guid ID类型是否搞砸了?

1 个答案:

答案 0 :(得分:0)

该问题是由于对EF Core的“急切加载”策略不了解所致。

根据these docs的提示,只会自动填充先前加载到上下文中的属性。当我们在每个请求上重新创建上下文并且之前没有在该特定上下文上加载User时,它不会自动出现在Session上。

因此,解决方案非常简单:

var session = apiContext.Sessions.SingleOrDefault(s => s.id == wantedUid)
    .Include(s => s.User);