是否可以在Entity Framework Core 2.1版上自动映射数据库视图?

时间:2018-06-13 10:14:03

标签: c# asp.net-core entity-framework-core asp.net-core-2.1

我发现this interesting question on stackoverflow关于映射视图并在EF Core中使用它。
根据its answer,以前的EF Core版本无法自动映射视图。

但现在呢?根据{{​​3}},

  

EF Core模型现在可以包含查询类型。与实体类型不同,   
查询类型没有在其上定义的键,也无法插入,   
删除或更新(即它们是只读的),但可以返回   
直接通过查询。查询类型的一些使用方案是:

     
      
  • 映射到没有主键的视图
  •   
  • (...)
  •   

所以问题是:是否可以自动构建数据库上下文并映射其视图(就像我们对现有数据库的Entity Framework 2.1 Roadmap所做的那样)?如果是的话,有谁知道怎么做?

或者唯一的方法仍然是a normal scaffold-dbcontext正如Sampath Kaliyamurthy在以前的EF Core版本的答案中所说的那样?

2 个答案:

答案 0 :(得分:2)

 

解决方法解决方案:

我找到了一个解决方法,其中包括:

  1. 重命名视图(例如,从“MyView”重命名为“My_View”)
  2. 使用select * into table from view查询从该视图创建一个表,并将其命名为视图初始名称(例如,该表将命名为“MyView”)
  3. 在表格中设置主键
  4. Scaffold the DB,这样您就可以获得所有类和正确的映射
  5. 从映射描述符中删除HasKey属性
  6. 从数据库中删除该表并使用其初始名称重命名该视图(因此,再次从“My_View”再到“MyView”)
  7. 这将使视图像普通的脚手架表一样,您将获得所有正确的映射和一切。
    唯一的区别当然是您无法在其中插入数据或进行编辑。
    但是没关系,因为如果你想使用观点,你从一开始就知道这一点!

    但是

    考虑到这个问题仍然开放......

    ...因为尽管有这种解决方法,但我仍然想知道是否有更多“立即”和“2.1原生”的东西,正如他们在路线图中所说的那样在ef 2.1中引入。

    所以任何帮助和/或回答都会像欣赏一样!

答案 1 :(得分:2)

可以为视图搭建脚手架。只需像搭建表一样使用 -Tables,只使用视图的名称。例如,如果您的视图名称是“vw_inventory”,则在包管理器控制台中运行此命令(将您自己的信息替换为“我的...”):

PM> Scaffold-DbContext "Server=MyServer;Database=MyDatabase;user id=MyUserId;password=MyPassword" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Temp -Tables vw_inventory

此命令将在项目的 Temp 目录中创建模型文件和上下文文件。您可以将模型文件移动到您的模型目录中(记得更改命名空间名称)。您可以从上下文文件中复制您需要的内容并将其粘贴到项目中相应的现有上下文文件中。

注意:如果您想在使用本地数据库的集成测试中使用您的视图,您需要创建视图作为数据库设置的一部分。如果您要在多个测试中使用该视图,请确保添加该视图是否存在的检查。在这种情况下,由于 SQL“创建视图”语句需要是批处理中的唯一语句,因此您需要在存在检查语句中将创建视图作为动态 Sql 运行。或者,您可以单独运行“if exists drop view...”,然后运行“create view”语句,但如果多个测试同时运行,您不希望在另一个测试正在使用视图时删除该视图。 示例:

  void setupDb() {
    ...
    SomeDb.Command(db => db.Database.ExecuteSqlRaw(CreateInventoryView()));
    ...
  }
  public string CreateInventoryView() => @"
  IF OBJECT_ID('[dbo].[vw_inventory]') IS NULL
    BEGIN EXEC('CREATE VIEW [dbo].[vw_inventory] AS
       SELECT ...')
    END";

这是一个有用的链接。它描述了手动添加代码部分而不是搭建它们:https://docs.microsoft.com/en-us/ef/core/modeling/keyless-entity-types?tabs=fluent-api