这全部适用于 Entity Framework Core v8.0.10、.NET 8 和 Oracle 19.0.0。
我的数据库中有这个视图:
CREATE VIEW VW_TESTVIEW
AS
SELECT 'THIS IS A TEST' AS EXAMPLE
FROM DUAL;
这仅返回一条记录,其中包含名为
EXAMPLE
的列,其内容为 THIS IS A TEST
:
在我的 .NET 8 应用程序中,我添加了此类:
public class VW_TestView
{
public string Example { get; set; }
}
在我的
DbContext.OnModelCreating
方法中,我添加了以下代码:
modelBuilder
.Entity<VW_TestView>(x =>
{
x.HasNoKey();
x.ToView("VW_TESTVIEW");
});
此外,我还添加了以下属性:
DbContext
:
public virtual DbSet<VW_TestView> TestViews { get; set; }
当我运行
Add-Migration ExampleView
时,生成的 Migration.Up
方法具有以下 CreateTable
:
migrationBuilder.CreateTable(
name: "VW_TESTVIEW",
columns: table => new
{
EXAMPLE = table.Column<string>(type: "NVARCHAR2(2000)", nullable: false)
},
constraints: table =>
{
});
因此,应用此迁移会失败,因为已存在同名的对象。
如果我忽略模型中的实体,我仍然无法使用
TestViews
DbSet,因为它返回此错误:
System.InvalidOperationException:无法为“VW_TestView”创建 DbSet,因为此类型未包含在上下文的模型中
ToView
不做它所说的事情?(“配置实体类型在定位关系数据库时映射到的视图。”)使用 EF Core 使用表示数据库视图的类的正确方法是什么?
我认为你很好地表达了观点。
为什么 ToView 不做它所说的事情? (“配置针对关系数据库时实体类型映射到的视图。”)
它实际上做了应该做的事情。
我认为对你有用的是你可以删除migrationBuilder.CreateTable(..以在Migration.Up中创建视图
如果您不喜欢这样做,请不要在迁移“向上”中指定视图的创建...