簡體   English   中英

ef core 如何一次從具有外鍵的不同表中獲取數據? (數據庫優先)

[英]ef core how to get data from different tables with foreign keys at once? (DB first)

我的項目中有兩個表,“教育者”和“教育者許可證”。

教育者許可證取決於具有外鍵的教育者表。 (數據庫優先)

我的數據庫中帶有 id 的外鍵:(教育者可以擁有 N 個許可證)

在此處輸入圖像描述

我的教育家 model 喜歡:

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; }
}

我的教育工作者許可證 model 像:

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);
    });
}

我得到了那個例外: 在此處輸入圖像描述

我希望它在獲取教育者表時獲得教育者許可證表。

我想我可以在業務層做到這一點,通過延遲加載兩次訪問數據庫。

有沒有辦法讓兩個表同時相互連接?

您以錯誤的方式配置外鍵。 以下代碼 -

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列表。

小費:
為了更好地反映它是某物的集合這一事實(因此,關系的多端),您應該將Educator Many中的EducatorLicense屬性重命名為其復數形式EducatorLicenses

嘗試用這個替換你的數據庫上下文

            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 License 的 Educator class 重命名為 EducatorLicenses

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM