gpt4 book ai didi

entity-framework - 映射到 View 的对象的意外迁移

转载 作者:行者123 更新时间:2023-12-04 08:28:54 27 4
gpt4 key购买 nike

问题

我们有一个对象

public class Foo
{
[Key, Column(Order = 0)]public virtual int A { get; set; }
[Key, Column(Order = 1)]public virtual int B { get; set; }
}

需要映射到 SQL Server 中的索引 View 。以方法为基础

EF Code First : Mapping nontable objects with Fluent APIhttps://stackoverflow.com/a/20887064/141172

我们首先创建了一个初始迁移

public override void Up()
{
CreateTable("dbo.Foos",
c => new { A = c.Int(nullable:false), B = c.Int(nullable:false) })
.PrimaryKey(t => new { t.A, t.B });
}

然后是一个空迁移,我们在其中添加了 SQL 以删除自动生成的表,然后添加索引

public override void Up()
{
Sql(@"DROP TABLE Foos");
Sql(@"CREATE VIEW dbo.Foos As....");
}

最后在我们的 DbContext 中,Foo 被映射到 View :

modelBuilder.Entity<Foo>().ToTable("Foos");

这工作得很好,直到我们向 Foo 添加另一个属性:

[Key, Column(Order = 2)]public int C { get; set; }

我们添加了一个新的迁移来重新定义 View

public override void Up()
{
Sql(@"ALTER VIEW Foos ....");
}

正确应用了 Alter View 迁移,但 EF 认为它必须创建一个迁移来说明新属性。

Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration.

当我运行时

Add-Migration WhatIsPending

EF 生成

public override void Up()
{
DropPrimaryKey("dbo.Foos");
AddColumn("dbo.Foos", "C", c => c.Int(nullable: false));
AddPrimaryKey("dbo.Foos", new[] {"A", "B", "C" });
}

问题

是否有更好的方法将对象映射到 View ,以便轻松更改对象?

如果这是最好的方法,我如何通知 EF Migrations 它不需要生成迁移?

最佳答案

我们找不到告诉 EF 不要创建迁移的方法,但这种方法可能会有所帮助:

  1. 创建 POCO 时,不要在迁移中使用 CreateTable()。如果 EF 想要创建一个迁移文件,没问题,但您可以将代码注释掉,这样只有您的 Sql(@"Create View ..."); 运行。

  2. 然后我们所要做的就是为 View 创建 DbSet,而不是 modelBuilder.Entity 条目。

  3. 当您需要进行更改时,以与任何其他表格相同的方式开始。对 POCO 进行更改,然后运行 ​​Add-Migration 并让它为您创建迁移。注释掉它想做的任何事情,并添加你的 Alter View 脚本。确保你在 Down 中创建一个相应的脚本。

这样一来,每次更改都只有一个迁移文件。

关于entity-framework - 映射到 View 的对象的意外迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27407101/

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