如何获取 EF Core 中表对应的实体列表

问题描述 投票:0回答:0

在EF Core的派生

DbContext
中,在
OnModelCreating(ModelBuilder modelBuilder)
方法中,我可以通过调用
modelBuilder.Model.GetEntityTypes()
获取模型中定义的所有实体类型。

我的问题是我的一些实体具有复杂类型的属性,即属性类型是类而不是字符串或数字。属性定义中使用的那些类也成为模型中定义的实体,并由

modelBuilder.Model.GetEntityTypes()
返回。我怎样才能只得到对应于数据库表的实体?

重现步骤:

  1. 创建 C# 控制台应用程序。
  2. 添加 EF 和 Npgsql nuget 包:
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.3" />
  1. Program.cs
    的内容替换为以下内容:
using System.Linq;
using Microsoft.EntityFrameworkCore;

public class Program
{
    public static void Main(string[] args)
    {
        DbContextOptions<MyDbContext> options = new DbContextOptionsBuilder<MyDbContext>().UseNpgsql().Options;
        MyDbContext myDbContext = new(options);
        myDbContext.Database.EnsureCreated();
    }
}

public class MyDbContext : DbContext
{
    public DbSet<MyEntity> MyEntities { get; private set; }

    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyEntity>().Property(e => e.StoreAsJson).HasColumnType("jsonb");
        var entityTypes = modelBuilder.Model.GetEntityTypes().Where(et => !et.IsOwned()).ToList();
    }
}

public class MyEntity
{
    public string Id { get; set; }
    public StoreAsJson StoreAsJson { get; set; }
}

public class StoreAsJson
{
    public string Id { get; set; }
    public string Value { get; set; }
}
  1. 在行后放置一个断点
    var entityTypes = modelBuilder.Model.GetEntityTypes().Where(et => !et.IsOwned()).ToList();
  2. 运行程序并检查
    entityTypes
    包含多少个实体。
entity-framework entity-framework-core
© www.soinside.com 2019 - 2024. All rights reserved.