C# 是否可以在EntityFramework核心版本2.1上自动映射DB视图?

C# 是否可以在EntityFramework核心版本2.1上自动映射DB视图?,c#,asp.net-core,entity-framework-core,asp.net-core-2.1,C#,Asp.net Core,Entity Framework Core,Asp.net Core 2.1,我找到了关于映射视图并在EF Core中使用它的方法。 根据,以前的EF核心版本无法自动映射视图 但是现在呢?据报道, EF核心模型现在可以包含查询类型。与实体类型不同, 查询类型没有定义键,因此无法插入, 已删除或更新(即只读),但可以返回 直接通过查询。查询类型的一些使用场景包括: 映射到没有主键的视图 (……) 所以问题是:是否有可能自动构建数据库上下文并映射其视图(就像我们对现有数据库所做的那样)?如果是,有人知道怎么做吗 或者唯一的方法仍然是Sampath Kaliyamurthy

我找到了关于映射视图并在EF Core中使用它的方法。
根据,以前的EF核心版本无法自动映射视图

但是现在呢?据报道,

EF核心模型现在可以包含查询类型。与实体类型不同,
查询类型没有定义键,因此无法插入,
已删除或更新(即只读),但可以返回
直接通过查询。查询类型的一些使用场景包括:

  • 映射到没有主键的视图
  • (……)
所以问题是:是否有可能自动构建数据库上下文并映射其视图(就像我们对现有数据库所做的那样)?如果是,有人知道怎么做吗

或者唯一的方法仍然是Sampath Kaliyamurthy在回答之前的EF Core版本时所说的?

解决方案: 我发现了一个解决方案,包括:

  • 重命名视图(例如,从“MyView”重命名为“My_视图”)
  • 使用
    select*into table from view
    query从该视图创建一个表,并将其命名为视图的初始名称(例如,该表将命名为“MyView”)
  • 在表中设置主键
  • ,这样就可以得到所有的类和正确的映射
  • 从映射描述符中删除
    HasKey
    属性
  • 从数据库中删除表,并使用其初始名称重命名视图(因此,再次从“My_视图”重命名为“MyView”)
  • 这将使视图像一个普通的脚手架表一样工作,您将获得所有正确的映射和所有内容
    当然,唯一的区别是您将无法在其中插入数据或编辑数据
    但是这没关系,因为如果您想使用视图,您从一开始就知道这一点


    但是这个问题还是开了… …尽管有这种解决方法,我仍然想知道是否有更“直接”和“2.1-native”的东西,如他们在路线图中所说的,在ef 2.1中引入

    因此,任何帮助和/或回答都将是非常感谢的

    可以构建视图。只需按照构建表的方式使用-Tables,只需使用视图的名称即可。例如,如果视图的名称为“vw_inventory”,则在Package Manager控制台中运行此命令(将您自己的信息替换为“My…”):

    此命令将在项目的临时目录中创建模型文件和上下文文件。您可以将模型文件移动到模型目录中(记住更改名称空间名称)。您可以从上下文文件中复制所需内容,并将其粘贴到项目中适当的现有上下文文件中

    注意:如果要在使用本地db的集成测试中使用视图,则需要在db设置中创建视图。如果要在多个测试中使用该视图,请确保添加对该视图存在性的检查。在这种情况下,由于SQL“Create View”语句必须是批处理中的唯一语句,因此需要在EXISTION check语句中以动态SQL的形式运行Create View。或者,您可以运行单独的“if exists drop view…”语句,然后运行“create view”语句,但是如果多个测试同时运行,您不希望在另一个测试正在使用该视图时删除该视图。 例如:


    这是一个有用的链接。它描述了手动添加代码节而不是搭建代码节:

    您尝试过做这些事情吗?@Brad是的,但是视图不会自动映射。我有一个解决方案,包括重命名视图,从该视图创建一个表,构建数据库,然后删除表并重命名视图,但我想知道是否有更“直接”和“2.1-native”的解决方案(我将把这个解决方案作为编辑添加到问题中)当然,EF Core 2.1添加了可使用
    ToView
    fluent API映射到db视图的功能。我不知道是否有脚手架支持。@IvanStoev谢谢你提供的信息,我不知道!我不认为脚手架支持它,我会尽快给你一个尝试,我会告诉你!如果您有多个视图,这将是大量的工作!更不用说,每次对数据库进行更改并希望再次构建数据库时,都必须经历这个过程。我一直使用的解决方法是视图的部分类。仍然不理想,但再次搭建脚手架后几乎不需要工作。我自己也在寻找更好的解决方案。你好@Naner,谢谢你的评论!请随意留下这个问题的答案,解释你会发现最合适的解决方案/解决方法,因为这个问题中的观点越来越多,我认为这对很多人都很有用
    PM> Scaffold-DbContext "Server=MyServer;Database=MyDatabase;user id=MyUserId;password=MyPassword" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Temp -Tables vw_inventory
    
      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";