[英]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.