gpt4 book ai didi

c# - 带有 View 的 Entity Framework 6 迁移

转载 作者:行者123 更新时间:2023-12-05 03:07:09 26 4
gpt4 key购买 nike

在使用 EF6 进行迁移时,我需要映射到一个 View 。

该 View 以其他 2 个表为中心,以启用基础数据的简单摘要 View ,其想法是允许我们在摘要索引 View 中使用它。

我遇到的问题是我无法创建部署 View (理想目标)或在没有 View 的情况下部署数据库以供以后手动部署的迁移。

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

目前使用 EF6 访问 View 的最佳方式是什么,即使我失去了通过迁移自动部署它们的能力,也不会导致迁移错误。

更多细节

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

Reports 和 ReportAnswers 是通过 EF Migrations 删除的。该 View 目前是一个脚本,需要以某种方式添加到部署中。

Reports、ReportAnswers 和 ReportView 可以从 db Context 访问

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创建空白迁移,然后手动将 View 添加到 Up()Down()方法,但这只会使迁移和更新命令陷入僵局,每个命令都希望另一个先运行。

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

最佳答案

几天前我刚刚浏览了一篇关于在 EF Core 中使用 View 的有趣文章,但我发现在使用 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 生成器并将其插入迁移的选项,但我想这不是您要找的东西。

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

相关链接:

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)

关于c# - 带有 View 的 Entity Framework 6 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48265412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com