对象映射到视图的不需要的迁移

时间:2014-12-10 17:21:54

标签: entity-framework entity-framework-6 ef-migrations

问题

我们有一个对象

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 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被映射到视图:

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它不需要生成迁移?

1 个答案:

答案 0 :(得分:1)

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

  1. 创建POCO时,请勿在迁移中CreateTable()。如果EF想要创建一个迁移文件,那很好,但是你可以将代码注释掉,只有你的Sql(@"Create View ...");运行。

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

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

  4. 这样,每次更改只需一个迁移文件。