如何在内存中没有密钥的情况下对 EF core 3 视图进行单元测试?

use*_*989 8 entity-framework-core ef-core-3.0

我正在玩 EF Core 3 并编写一些单元测试,但似乎无法为视图设置测试数据。

当我尝试保存时,出现错误:

无法跟踪类型实例,因为它没有主键。只能跟踪具有主键的实体类型

public class EFContext : DbContext
{
    public DbSet<ViewItem> ViewItems { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ViewItem>().HasNoKey().ToView("vTestView");
    }
}

using (EFContext efContext = new EFContext())
{
    efContext.ViewItems.Add(new ViewItem
    {
        Name = "This is test item #1"
    });

    efContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 5

解决方法:IsInMemory()

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ViewItem>(entity =>
    {
        if (!Database.IsInMemory())
        {
            entity.HasNoKey();
            entity.ToView("vTestView");
        }
        else
        {
            entity.HasKey(e => e.Name);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

更新:为了在测试时和运行时之间保留被测属性的行为,您可以添加一个(按照惯例)仅在测试期间使用的关键属性,并且您将模型配置为在不进行测试时忽略该属性:

public class ViewItem 
{
    public int TestOnlyKey { get; set; }
    public string Name { get; set; }
}
public class EFContext : DbContext
{
    public DbSet<ViewItem> ViewItems { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ViewItem>(entity =>
        {
            if (!Database.IsInMemory())
            {
                entity.HasNoKey();
                entity.Ignore(e => e.TestOnlyKey);
                entity.ToView("vTestView");
            }
            else
            {
                entity.HasKey(e => e.TestOnlyKey);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)