无法为“Product”创建 DbSet,因为此类型未包含在上下文的模型中

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

我正在尝试对 dbContext 的派生类进行单元测试。我不断收到错误消息

[Fact]
public void GetAssync_Method_Called()
{
   var options = new DbContextOptionsBuilder<CoreDbContext>()
       //.UseModel()       USE MODEL
       .UseInMemoryDatabase(databaseName: "test")
       .Options;

    using (var context = new CoreDbContext(options))
    {

       context.Set<Product>(); //THIS IS THE WAY TO ADD AN ENTITY IN THE CONTEXT...????

       Expression<Func<Product, bool>> filter = x => !x.IsDeleted == 1;
       var result = GetAllAsNoTrackin(filter);

       Assert.Equal(1, result.Count());
    }
}

下面是 CoreDbContext 和我正在测试的方法。

public class CoreDbContext : DbContext
{
   public CoreDbContext(DbContextOptions<CoreDbContext> options) : base(options)
   {
   }

   public IQueryable<Product> GetAllAsNoTrackin(Expression<Func<Product, bool>> filter)
   {
       var dbSet = Set<Product>().AsNoTracking(); //GETTING ERROR HERE...

       //more code...
   }
 }

我不断收到同样的错误:

无法为“Product”创建 DbSet,因为此类型未包含在上下文的模型中

谷歌搜索后,看起来

DbContextOptionsBuilder
有一个名为
UseModel(IModel model)
的方法,可以代替
OnModelCreating(ModelBuilder builder)
被调用。

不幸的是,我没有在任何地方看到任何有关如何使用它的代码。此外,添加新实体是在创建上下文之后发生的,而

UseModel()
是要传递给
DbContext
的选项的扩展方法。

感谢您的帮助

entity-framework-core dbcontext
1个回答
0
投票

A

DbContext
需要了解实体,它不会发现并假设您在项目中定义的每个类都是实体。有几种方法可以通过约定和/或显式配置来完成此操作。

DbContext 了解实体的最常见方式是通过声明的 DbSet:

public class CoreDbContext : DbContext
{
    public DbSet<Product> Products { get; set; } 
}

这里 DbContext 初始化将识别 Product 实体,并使用约定将其及其公共属性(包括导航属性实体类型)与表结合起来。

如果您没有

DbSet
或与具有
DbSet
的实体的关系,或者无法遵循约定来正确映射它,则需要显式配置。两种常见的方法是通过
OnModelCreating
或使用
IEntityTypeConfiguration
,然后在
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly);
内使用
OnModelCreating
。这假设实体在与
DbContext
相同的程序集中声明,否则您可以传递任何程序集引用来定位每个实体的
IEntityTypeConfiguration
实现。
DbContext
可以通过
Set<TEntity>
访问配置的实体,但通常通过 DbContext 中的
DbSet<TEnitity>
属性声明和访问这些实体更简单。

与访问和配置实体相关的几乎所有内容都通过 Microsoft 文档中的示例进行了深入介绍:

https://learn.microsoft.com/en-us/ef/core/

© www.soinside.com 2019 - 2024. All rights reserved.