我正在尝试对 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
的选项的扩展方法。
感谢您的帮助
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/