我有两个类:User 和 Ticket,以及 DBContext
public class Ticket
{
public long Id { get; set; }
public string Text { get; set; }
public DateTime Date { get; set; }
public long UserId { get; set; }
public User User { get; set; } = null!;
}
public class User
{
public long Id { get; set; }
public string Name { get; set; }
public string PasswordHash { get; set; }
}
public class Database : DbContext
{
public Database() { }
public Database(DbContextOptions<Database> options) : base(options)
{
}
public DbSet<Ticket> Tickets { get; set; }
public DbSet<User> Users { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseMySQL("server=server;port=port;user=user;password=password;database=mydb");
}
}
并且MySQL中有两张表对应的字段。我需要在用户和票证表之间建立一对多关系。 Ticket 类中的 UserId 是 tickets 表中的 ForeignKey,引用 id 属性上的 users 表。
public User User
是一个导航属性。
我需要调用
context.Tickets.Include(t => t.User)
使 User
类中的 Ticket
非空(在启动时 User 的值为空),但是 UserId
在调用之前已经有一个值。我可以这样做,以便立即定义 User
并且我不需要调用 context.Tickets.Include(t => t.User)
吗?
我尝试直接使用link中描述的方法设置表之间的链接,但是没有用。
解决方案 1:你需要主动延迟加载
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
optionsBuilder.UseMySQL("..")
}
解决方案 2:使用 AutoInclude
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Ticket>()
.Navigation(e => e.User)
.AutoInclude();
}