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)
解决方法: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)
归档时间: |
|
查看次数: |
5710 次 |
最近记录: |