实体框架6使用视图迁移

时间:2018-01-15 14:54:49

标签: c# entity-framework entity-framework-6

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

该视图支持其他两个表,以启用基础数据的简单摘要视图,这个想法允许我们在摘要索引视图中使用它。

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

在大多数尝试中,在其他SO问题之后,我最终导致Add-MigrationUpdate-Database命令陷入僵局,或者通常会导致错误中断一个或另一个错误。

当前使用EF6访问视图的最佳方式是什么,即使我无法通过迁移自动部署它们,也不会导致迁移错误。

更多细节

Db包含2个表Reports和ReportAnswers。视图ReportView将这两个视图组合在一起并将其转向ReportAnswers,以允许某些行成为此摘要视图中的列。

报告和ReportAnswers通过EF迁移进行了删除。该视图当前是一个需要以某种方式添加到部署的脚本。

Reports,ReportAnswers&可以从db Context

访问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>();在运行迁移时忽略该类型,但事实证明这非常容易出错,即使它看起来至少有效一次。

1 个答案:

答案 0 :(得分:2)

我几天前走过有趣的文章,关于在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}

这不完美,但我希望至少有用。

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

还可以选择创建自定义代码或sql生成器并将其插入到迁移中,但我想这不是您要查找的内容。

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

相关链接:

Using Views with Entity Framework Code First

EF CODE FIRST - VIEWS AND STORED PROCEDURES

Leveraging Views in Entity Framework

DbMigration.Sql Method (String, Boolean, Object)

DbMigration.SqlFile Method (String, Boolean, Object)