ef core 如何一次从不同的表中获取带有外键的数据? 数据库优先

问题描述

我的项目中有两个表,“教育者”和“教育者许可证”。

教育者许可证依赖于带外键的教育者表。 (数据库优先)

我的数据库中带有 id 的外键: (教育者可以有N个执照)

enter image description here

我的教育模式如下:

public class Educator
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonIgnore]
    public int id { get; set; }
    [JsonIgnore]
    public int CompanyId { get; set; }
    public string PublicId { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }
    public int Password { get; set; }
    public bool Gender { get; set; }
    public string AdminNote { get; set; }
    public List<EducatorLicense> EducatorLicense { get; set; }
    public bool Status { get; set; }
    public TimestampsModel Timestamps { get; set; }
}

我的教育工作者许可模型如下:

public class EducatorLicense
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }
    [JsonIgnore]
    public int EducatorId { get; set; }
    public string LicenseType { get; set; }
}

我的数据库上下文:

protected override void OnModelCreating(ModelBuilder model)
{
    model.Entity<Educator>(builder =>
    {
        builder.ToTable("educators");
        builder.Property(p => p.id)
            .ValueGeneratedOnAdd();
        builder.OwnsOne(c => c.Timestamps,a =>
            {
                a.Property(p => p.CreatedAt).HasColumnName("createdAt");
                a.Property(p => p.UpdatedAt).HasColumnName("updatedAt");
            });

        builder.HasOne(d => d.EducatorLicense)
            .WithMany()
            .HasForeignKey(d => d.Id)
            .OnDelete(DeleteBehavior.ClientSetNull)
            .HasConstraintName("educatorlicenses_educatorid_foreign");
    });

    model.Entity<EducatorLicense>(builder =>
    {
        builder.Property(p => p.id)
            .ValueGeneratedOnAdd();
        builder.HasKey(c => c.id);
    });
}

我得到了那个例外:

enter image description here

我希望它在获取教育者表时获取教育者许可表。

我想我可以在业务层做到这一点,通过延迟加载两次访问数据库

有没有办法让两个外来的表同时相互连接?

解决方法

您以错误的方式配置外键。下面的代码 -

builder.HasOne(d => d.EducatorLicense)
    .WithMany()
    .HasForeignKey(d => d.Id)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("educatorlicenses_educatorid_foreign");

应该是 -

builder.HasMany(d => d.EducatorLicense)
    .WithOne()
    .HasForeignKey(d => d.EducatorId)
    .OnDelete(DeleteBehavior.ClientSetNull)
    .HasConstraintName("educatorlicenses_educatorid_foreign");

然后如果你查询 -

var educatorList = myDbContext.Educators.Include(p=> p.EducatorLicense).ToList();

您将获得一个 Educator 列表以及它们的 EducatorLicense 列表。

提示:
为了更好地反映它是某物的集合这一事实(因此,关系的 Many 端),您应该将 EducatorLicense 类中的 Educator 属性重命名为其复数形式 { {1}}。

,

尝试用这个替换你的数据库上下文

            modelBuilder.Entity<Educator>(entity =>
            {
                entity.HasOne(d => d.Educator)
                    .WithMany(p => p.EducatorLicences)
                    .HasForeignKey(d => d.EducatorId)
                    .OnDelete(DeleteBehavior.ClientSetNull);

                  });

               builder.OwnsOne(c => c.Timestamps,a =>
                {
                    a.Property(p => p.CreatedAt).HasColumnName("createdAt");
                    a.Property(p => p.UpdatedAt).HasColumnName("updatedAt");
                });

将 Educator 添加到您的 EducatorLicense

 public class EducatorLicense
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    public int id { get; set; }
    [JsonIgnore] public int EducatorId { get; set; }
    public Educator Educator { get; set; }
    public string LicenseType { get; set; }
}

将 Educator 类的 EducatorLicense 重命名为 EducatorLicenses

public List<EducatorLicense> EducatorLicenses { get; set; }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...