使用Entity Framework 6 Code First创建SQL视图

5
我刚接触Entity Framework 6 Code First,并尝试执行一个我认为很简单的任务。我想创建一个SQL视图,然后在我的数据库上下文中拥有一个实体,以便可以使用它来查询该视图。
我已经尝试了一些文章,例如这个,但我的情况与之不同的关键是SQL视图不是来自另一个现有数据库的现有视图。
我检查了这篇文章中提出的建议,但对我来说似乎过于繁琐,因为我需要创建一些扩展方法来完成如此简单的任务,即创建一个视图/实体组合并在我的数据库上下文中使用它。
我是否遗漏了什么?我知道如果我不使用Code First会更容易,但请记住,我正在使用Code First,而且我正试图创建一个视图,而不是从现有数据库中重用一个视图。

1
EF的整个目的是为了摆脱需要视图和存储过程的需求。您能否提供更多关于为什么要创建视图的信息? - malkassem
您可以在迁移中创建视图,方法如下:https://dev59.com/fmEi5IYBdhLWcg3w4Pnr#20887064 - Colin
@malkassem 这值得一提。然而,我只是因为查看现有的数据库才需要这样做。 - noelicus
3个回答

7

Colin和Kevin,感谢你们提供的答案链接和简洁的回答。我使用了几个资源,最终创建了一个可查询的实体,基于新的SQL视图。以防其他刚接触EF 6.0 Code First的人,我有一些步骤,希望能在未来对其他人有所帮助。

  1. 对于经验丰富的Entity Framework开发人员来说可能很明显,但为了执行“迁移”方法,您需要禁用自动迁移并深入了解Code First Migrations的内部工作原理。由于自动迁移默认已启用,我已经创建了一个相当复杂的数据库,其中包含了所有依赖于自动迁移和每次运行应用程序时都要重建数据库的种子脚本。这篇文章帮助我清除了我的迁移历史记录,并关闭了自动迁移(如果您想知道,我选择了web.config方法)
  2. 在清除了我的迁移信息之后,我从解决方案资源管理器中删除了mdf文件。这确保了在运行Update-Database命令时不会遇到任何问题(更多步骤请参见下面的列表)。
  3. 然后,在Package Manager控制台中执行Add-Migration Initial命令,以生成“Initial”迁移。其结果是可编辑的Up和Down方法,如Colin的答案中所述。然后,我按照Colin的答案中所述的步骤注释了表创建语句(Entity Framework尝试创建一个表,但我们实际上想要创建一个视图并将其映射到实体),并在Up方法的末尾插入了自己的视图创建SQL语句。将创建语句放在它可能依赖的任何表的创建之后很重要。我还在Configuration.Seed方法中执行了我的Seed活动,而不是在我的Context的Seed方法中执行。如果您正在处理多个迁移,则可以看到这很重要。最后,如Colin建议的那样,我将表映射添加到了我的上下文的OnModelCreating事件中。
  4. 这个过程的最后一步是实际应用迁移到数据库中。为此,在Package Manager控制台中执行Update-Database命令。该语句将使用您在早期步骤中创建和编辑的“Initial”迁移重建数据库。

仍然让我惊讶的是,我需要做所有这些定制工作来创建一个视图,并将其映射到Code First的实体,但归根结底,这对于开始使用迁移非常有帮助,因为您无论如何都只能依赖于“自动迁移”。


0

Colin提供的链接中的答案可以完成任务。

如果需要创建大量视图,将视图查询保存在单独的文件中并将它们添加到资源(.resx)文件中,而不是在Migration Up()方法中硬编码SQL查询,可能是一个好主意。

例如:

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

不要像硬编码一样

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

0

您可以手动添加 SQL 语句以创建视图到迁移中,然后按照第一个链接进行使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接