簡體   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