繁体   English   中英

实体框架6迁移视图

[英]Entity Framework 6 Migrations with views

在使用EF6进行迁移时,我需要映射到视图。

该视图可透视其他2个表,以实现基础数据的简单汇总视图,其思想是允许我们在汇总索引视图中使用它。

我遇到的问题是我无法创建一个迁移,该迁移要么部署视图(理想目标),要么部署没有视图的数据库,以供以后手动部署。

在大多数尝试中,在出现其他SO问题之后,我最终要么死锁了Add-MigrationUpdate-Database命令,要么通常会导致使另一个中断的错误。

即使我失去了在迁移过程中自动部署视图并不会导致迁移错误的能力,使用EF6访问视图的当前最佳方法是什么。

更多细节

Db包含2个表Reports和ReportAnswers。 视图ReportView结合了这两者,并枢转了ReportAnswers,以允许某些行成为此摘要视图中的列。

Reports和ReportAnswers通过EF迁移进行了去污。 该视图当前是一个脚本,需要以某种方式将其添加到部署中。

可从db上下文访问报表,ReportAnswers和ReportView

public virtual DbSet<ReportAnswer> ReportAnswers { get; set; }
public virtual DbSet<Report> Reports { get; set; }
public virtual DbSet<ReportView> ReportView { get; set; }

我曾尝试使用Add-Migration Name -IgnoreChanges创建一个空白迁移,然后将视图手动添加到Up()Down()方法中,但这只是使迁移和更新命令陷入僵局,每个命令都希望对方先运行。

我也尝试过使用modelBuilder.Ignore<ReportView>(); 在运行迁移时忽略类型,但这被证明非常容易出错,即使它似乎至少可以工作一次。

几天前,我刚刚浏览了有关在EF Core中使用视图的有趣文章,但是我发现使用EF 6也是如此。

您可能要使用Seed方法,而不是UpDown迁移方法。

protected override void Seed({DbContextType} context)
{
    string codeBase = Assembly.GetExecutingAssembly().CodeBase;
    UriBuilder uri = new UriBuilder(codeBase);
    string path = Uri.UnescapeDataString(uri.Path);
    var baseDir = Path.GetDirectoryName(path) + "\\Migrations\\{CreateViewSQLScriptFilename}.sql";

    context.Database.ExecuteSqlCommand(File.ReadAllText(baseDir));
}

您的SQL命令应类似于以下示例。

IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[{ViewName}]'))
EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[{ViewName}]
AS
SELECT {SelectCommand}

它不是完美的,但我希望至少有帮助。

我发现了有关该主题的另一篇博客文章,作者说在Up方法中使用Sql(@"CREATE VIEW dbo.{ViewName} AS...")Sql(@"DROP VIEW dbo.{ViewName};") Down法。 我说这是你没有提供从代码UpDown迁移方法。 也许好主意是添加SqlFile而不是Sql方法。

还有一个选项可以创建自定义的代码或sql生成器并将其插入迁移,但是我想这不是您想要的东西。

如果您需要其他帮助,请在评论中告知我。

相关链接:

首先使用带有实体框架代码的视图

EF代码优先-视图和存储程序

在实体框架中利用视图

DbMigration.Sql方法(字符串,布尔值,对象)

DbMigration.SqlFile方法(字符串,布尔值,对象)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM