[英]Entity Framework 6 Migrations with views
在使用EF6进行迁移时,我需要映射到视图。
该视图可透视其他2个表,以实现基础数据的简单汇总视图,其思想是允许我们在汇总索引视图中使用它。
我遇到的问题是我无法创建一个迁移,该迁移要么部署视图(理想目标),要么部署没有视图的数据库,以供以后手动部署。
在大多数尝试中,在出现其他SO问题之后,我最终要么死锁了Add-Migration
和Update-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
方法,而不是Up
和Down
迁移方法。
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
法。 我说这是你没有提供从代码Up
和Down
迁移方法。 也许好主意是添加SqlFile而不是Sql方法。
还有一个选项可以创建自定义的代码或sql生成器并将其插入迁移,但是我想这不是您想要的东西。
如果您需要其他帮助,请在评论中告知我。
相关链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.