【问题标题】:Create SQL View With Entity Framework 6 Code First使用 Entity Framework 6 Code First 创建 SQL 视图
【发布时间】:2015-10-22 12:37:32
【问题描述】:

我是 Entity Framework 6 Code First 的新手,我正在尝试执行我认为很简单的任务。我想创建一个 SQL 视图,然后在我的数据库上下文中有一个实体,我可以使用它来查询视图。

我尝试过诸如this 之类的文章,但在我的案例中,主要区别在于 SQL 视图不是来自另一个现有数据库的现有视图。

我检查了this article 中提出的建议,但我觉得我需要创建一些扩展方法来做一些简单的事情,比如创建视图/实体组合并在我的数据库上下文中使用它。

我错过了什么吗?我知道如果我不使用 Code First 会容易得多,但请记住它是 Code First,我正在尝试创建一个视图,而不是重用现有数据库中的视图。

【问题讨论】:

  • EF 背后的全部原因是摆脱对视图和存储过程的需求。您能否提供更多信息,说明您为何尝试创建视图?
  • 您可以像这样在迁移中创建视图:stackoverflow.com/a/20887064/150342
  • @malkassem 值得一说。但是,由于查看现有数据库,我只需要这样做。

标签: c# sql-server entity-framework ef-code-first


【解决方案1】:

Colin 和 Kevin,感谢您在另一篇文章中提供的答案链接以及您简洁的答案。我使用了多种资源最终创建了一个基于新 SQL 视图的可查询实体。以防万一其他人是 EF 6.0 Code First 的新手并且刚刚开始涉足,我确实有一些步骤有望在未来使其他人受益。

  1. 对于经验丰富的实体框架开发人员来说似乎很明显,但为了执行“迁移”方法,您需要禁用自动迁移并真正深入了解 Code First 迁移的内部工作原理。由于自动迁移是开箱即用的,我已经创建了一个相当复杂的数据库,其中包含种子脚本,所有这些都依赖于自动迁移并在每次运行我的应用程序时重建数据库。 This post 帮助我清除了我的迁移历史记录,并在关闭自动迁移的情况下进入了第 1 格(我使用了 web.config 方法,以防你想知道)
  2. 清除迁移信息后,我从解决方案资源管理器中删除了 mdf。这保证了我在运行 Update-Database 时不会遇到任何问题(在步骤列表的下方)。
  3. 然后在 Package Manger 控制台中,我执行了 Add-Migration Initial 以生成“初始”迁移。其结果是 Colin 的回答中描述的可编辑 Up 和 Down 方法。然后我按照科林回答中的步骤注释掉表创建语句(实体框架试图创建一个表,但我们真的想创建一个视图并将其映射到实体)并插入我自己的视图创建 sql 语句 在 Up 方法的末尾。在创建它可能依赖的任何表之后放置 create 语句很重要。我还在 Configuration.Seed 方法中执行了我的 Seed 活动,而不是在我的 Context 的 Seed 方法中。我知道如果您要处理多个迁移,这将是多么重要。最后,按照 Colin 的建议,我将表映射添加到上下文的 OnModelCreating 事件中。
  4. 最后一步是将迁移实际应用到数据库。为此,请在包管理器控制台中执行 Update-Database 命令。该语句将使用您在前面步骤中创建和编辑的“初始”迁移重建数据库。

仍然让我感到惊讶的是,我需要完成所有这些自定义工作来创建视图并将其映射到使用 Code First 的实体,但归根结底,这对我开始迁移很有帮助反正只依赖“自动迁移”这么久。

【讨论】:

    【解决方案2】:

    您可以手动添加 sql 以将视图创建到迁移中,然后根据您的第一个链接使用它。

    【讨论】:

      【解决方案3】:

      Colin 提供的链接中的答案可以解决问题。

      如果要创建大量视图,最好将视图查询保存在单独的文件中并将它们添加到资源 (.resx) 文件中,而不是在迁移中硬编码 sql 查询Up() 方法。

      例如

      public override void Up()
      {
          Sql("ResourceFileName.ResourceName");
      }
      

      而不是像硬编码那样

      {
              Sql("EXEC ('CREATE View [dbo].[ClientStatistics] AS --etc");
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        • 1970-01-01
        • 1970-01-01
        • 2014-04-06
        • 2013-11-02
        • 1970-01-01
        相关资源
        最近更新 更多