我创建了一个实体并映射到一个视图。
现在正确应用了迁移脚本,一切正常,但在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];");
}
}
答案 0 :(得分:1)
由于首先要使用EF代码查看视图,你必须告诉EF在DbContext映射中创建一个真实的表:
modelBuilder.Entity<MyView>().ToTable("MyView");
之后,您应该创建一个显式迁移,以删除该临时表并仅保留视图。
所以看来你还在使用真正的桌子。你可以试试几件事:
通过在MigrationsConfiguration文件中将AutomaticMigrationDataLossAllowed
设置为true,暂时启用数据丢失。运行迁移,然后再次将该值设置为false(以防止将来未被注意的数据丢失)。
正如in this answer所解释的那样,使用显式迁移删除表。
答案 1 :(得分:0)
如果将属性添加到模型类,则为Column2FromView
。 EF创建的列没有错误。
但是,如果您尝试从表中删除创建的列,则会警告您该列是否有数据。
您只需通过update-database -force
命令对其进行强制。