Code First EF,要查看的地图实体 - 未应用自动迁移,因为它会导致数据丢失

时间:2016-10-25 10:49:23

标签: entity-framework view ef-code-first

我创建了一个实体并映射到一个视图。 现在正确应用了迁移脚本,一切正常,但在Update-Database之后出现此错误,并且每次运行Update-Database后都会出现相同的错误:

(我不想禁用AutomaticMigration)

  

未应用自动迁移,因为它会导致数据   失利。将AutomaticMigrationDataLossAllowed设置为'true'   DbMigrationsConfiguration ....

AutomaticMigration生成:

IF object_id(N'[dbo].[FK_dbo.MyView_dbo.Table2_column1FromView]', N'F') IS NOT NULL
    ALTER TABLE [dbo].MyView DROP CONSTRAINT [FK_dbo.MyView_dbo.Table2_column1FromView]
    // (.. more similar lines...)
IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_column2FromView' AND object_id = object_id(N'[dbo].[MyView]', N'U'))
    DROP INDEX [IX_column2FromView] ON [dbo].[MyView]
    // (.. more similar lines...)

MyView的:

public class MyView
{
    [Key]
    public int Id { get; set; }

    public int? Column1FromView { get; set; }

    public int? Column2FromView { get; set; }

    .....
}

在DbContext中:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        ...

        modelBuilder.Entity<MyView>().ToTable("MyView");
    }

迁移:

public partial class CreateMyView : DbMigration
{
    public override void Up()
    {
        Sql(@"CREATE VIEW [dbo].[MyView] 
              AS SELECT .... FROM   dbo.MyTable   
              GO ");
    }

    public override void Down()
    {
       Sql("DROP VIEW [dbo].[MyView];");
    }
}

2 个答案:

答案 0 :(得分:1)

由于首先要使用EF代码查看视图,你必须告诉EF在DbContext映射中创建一个真实的表:

modelBuilder.Entity<MyView>().ToTable("MyView");

之后,您应该创建一个显式迁移,以删除该临时表并仅保留视图。

所以看来你还在使用真正的桌子。你可以试试几件事:

  • 通过在MigrationsConfiguration文件中将AutomaticMigrationDataLossAllowed设置为true,暂时启用数据丢失。运行迁移,然后再次将该值设置为false(以防止将来未被注意的数据丢失)。

  • 正如in this answer所解释的那样,使用显式迁移删除表。

答案 1 :(得分:0)

如果将属性添加到模型类,则为Column2FromView。 EF创建的列没有错误。 但是,如果您尝试从表中删除创建的列,则会警告您该列是否有数据。 您只需通过update-database -force命令对其进行强制。