NUnit 中 DbContextOptionsBuilder 的数据类型

Data type for DbContextOptionsBuilder in NUnit

我正在尝试查找 DbContextOptionsBuilder 的数据类型。

我有一个 Entity Framework DBContext 文件。我使用 NUnit 设置了一个 InMemory 数据库。我如何在没有 var 的情况下进行设置?我知道最好的做法是为每个测试都有一个干净的数据库,但只是想学习,并为多个测试拥有一个数据库。

电子 DBContext 文件

public partial class ElectronicsContext : DbContext
{
    public ElectronicsContext()
    {
    }

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

public virtual DbSet<Product> Product { get; set; }
public virtual DbSet<ProductCategory> ProductCategory { get; set; }

N单元测试

public class TestClass
{

[SetUp]
public void TestProducts()
{

   // This Works
   // var context = new DbContextOptionsBuilder<ElectronicsContext>()
   //     .UseInMemoryDatabase(databaseName: "ProductsTest")
   //     .Options;

   // This does not work
    DbContextOptionsBuilder<ElectronicsContext> context = new DbContextOptionsBuilder<ElectronicsContext>()
        .UseInMemoryDatabase(databaseName: "ProductsTest")
        .Options;

当运行这个:我收到下面的错误,但是它以其他方式工作

    [Test]
    public void TestProducts()
    {
        DbContextOptionsBuilder<ElectronicsContext> context = new DbContextOptionsBuilder<ElectronicsContext>()

        context.Product.Add(new Product { ProductId = 1, ProductName = "TV", ProductDescription = "TV testing", ImageLocation = "test" });
        context.SaveChanges();

Error: 'DbContextOptionsBuilder<ElectronicsContext>' does not contain a definition for 'Product' and no accessible extension method 'Product' accepting a first argument of type 'DbContextOptionsBuilder<ElectronicsContext>' could be found (are you missing a using directive or an assembly reference?) 

问题是您试图将 DbContextOptions 类型的对象分配给 DbContextOptionsBuilder<ElectronicsContext> 类型的变量。查看作业的最后一行,您有 .Options;

// This does not work
DbContextOptionsBuilder<ElectronicsContext> context = new DbContextOptionsBuilder<ElectronicsContext>()
    .UseInMemoryDatabase(databaseName: "ProductsTest")
    .Options;

由于 C# 是 static/strongly-typed,这是不允许的,编译器会报错。但是从 c# 3.0 开始,引入了 var。它无非就是语法糖,是语言提供的一种快捷方式,可以减少一些常见情况下必须编写的代码量。

您的示例是鼓励您使用的示例之一 var,比较行的长度和可读性...

没有var

DbContextOptionsBuilder<ElectronicsContext> context = new DbContextOptionsBuilder<ElectronicsContext>()

var

var context = new DbContextOptionsBuilder<ElectronicsContext>()