问题
我们有一个对象
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中的索引视图。以方法为基础
EF Code First : Mapping nontable objects with Fluent API和https://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被映射到视图:
modelBuilder.Entity<Foo>().ToTable("Foos");
这很好用,直到我们为Foo添加了另一个属性:
[Key, Column(Order = 2)]public int C { get; set; }
我们添加了一个新的迁移来重新定义视图
public override void Up()
{
Sql(@"ALTER VIEW Foos ....");
}
已正确应用Alter View迁移,但EF认为必须创建迁移以考虑新属性。
无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。
当我跑步时
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" });
}
问题
是否有更好的方法将对象映射到视图,这样对对象的更改是无痛的?
如果这是最佳方法,我如何通知EF Migrations它不需要生成迁移?
答案 0 :(得分:1)
我们找不到告诉EF不创建迁移的方法,但这种方法可能会有所帮助:
创建POCO时,请勿在迁移中CreateTable()
。如果EF想要创建一个迁移文件,那很好,但是你可以将代码注释掉,只有你的Sql(@"Create View ...");
运行。
我们所要做的就是为视图创建DbSet
,而不是modelBuilder.Entity
条目。
当您需要进行更改时,请以与其他任何表相同的方式启动。对POCO进行更改,然后运行Add-Migration
并让它为您创建迁移。注释掉它想要做的任何事情,并添加Alter View
脚本。确保在Down
中创建相应的脚本。
这样,每次更改只需一个迁移文件。