【问题标题】:How to generate DbSet dynamically in .net core?如何在.net core 中动态生成 DbSet?
【发布时间】:2021-08-07 20:07:51
【问题描述】:

我使用通用存储库,并且我想使用 dbcontext 而不为每个单独的数据库模型声明 dbset。我尝试了一些解决方案,但每次都遇到此错误:

无法为“PointsType”创建 DbSet,因为该类型不是 包含在上下文模型中。

public new DbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
{
  return base.Set<TEntity>();
}

BaseEntity 用于通用存储库。

有没有办法解决这个问题?

【问题讨论】:

  • 已添加到放置其他实体的实体文件夹中。事实上,在我的 DbContext 的同一个程序集中。 @GertArnold 我得到了答案。还是谢谢你。
  • 下次提问时,请尝试想象哪些信息是相关的。另外,如果回答对您有帮助,请将其标记为已接受,以便我们看到该问题已得到处理。

标签: c# entity-framework-core


【解决方案1】:

必须在 DbContext 中注册实体。它可以自行推断关系并发现其他实体,但最好是明确的。

你有两个选择:

1。将DbSet&lt;T&gt; 属性添加到 DbContext

一种方法是在 DbContext 类中添加 DbSet&lt;TEntity&gt; 属性:

class AppDbContext: DbContext {
    public DbSet<Product> Products { get; set; }
    // ...
}

这很简单,但需要为每个新实体修改 DbContext。

2。实施IEntityTypeConfiguration&lt;T&gt;

另一种方法是为所有实体实现IEntityTypeConfiguration&lt;TEntity&gt;,并让DbContext使用modelBuilder.ApplyConfigurationsFromAssembly方法发现配置。

请注意,DbContext 类中没有 DbSet&lt;TEntity&gt; 属性!

class AppDbContext: DbContext
{
    // no DbSet properties ?

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
    }
}

class Product
{
    public int Id { get; set; }
    public string Title { get; set; }
}

class ProductEntityConfiguration: IEntityTypeConfiguration<Product>
{
    public void Configure(EntityTypeBuilder<Product> builder)
    {
        builder.HasIndex(e => e.Title).IsUnique();
    }
}

现在您可以使用以下方法访问实体的 DbSet:

var productSet = dbContext.Set<Product>();

参考文献

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 2019-03-09
    • 1970-01-01
    • 2018-05-20
    • 2018-05-21
    • 1970-01-01
    • 2019-06-10
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多