我是否在我的EF Core中使用快照文件,迁移文件或数据注释来更新数据库?

时间:2016-09-19 19:10:31

标签: asp.net-core entity-framework-core

我试图了解在使用EF Core开发ASP.NET Core 1.0应用程序时可以选择的不同类型的迁移路径。当我创建我的第一个Core应用程序时,我注意到它生成了一个ApplicationDbContextModelSnapshot类,它使用ModelBuilder来构建模型。

然后我读到如果我需要向数据库添加表,我需要创建新模型并运行命令行来生成迁移文件并更新数据库。好的,我明白了。

但是当我这样做时,我注意到ApplicationDbContextModelSnapshot类也会更新。

1)这是否意味着我无法修改此ApplicationDbContextModelSnapshot类,因为它看起来每次都会重新生成?

2)我应该使用Data Annotations来构建我的模型,还是应该使用Fluent API来告诉我在ApplicationDbContext类中构建我的模型?咦?另一个构建模型的文件?

我在这里看到了三种不同的数据库处理方式,即快照类,数据注释和流畅的API。我很困惑,因为今天我在上一个迁移文件中犯了一个错误,所以我删除了文件,删除了数据库并重新进行了数据库更新。

但通过这样做我得到的错误类似于:

The index 'IX_Transaction_GiftCardId' is dependent on column 'GiftCardId'.
ALTER TABLE ALTER COLUMN GiftCardId failed because one or more objects access this column.

很自然地,我想知道是否必须修改ApplicationDbContextModelSnapshot类。

迁移或数据库更新时我应该采取的路径是什么,因为这三条路径让我感到困惑。

2 个答案:

答案 0 :(得分:2)

在创建迁移,进行模型更改,创建新迁移以及尝试更新数据库之前,我遇到过此问题。根本原因是当密钥被更改并且关系不被删除而且没有添加或不存在时。

您有两个选择

简易方法 最简单的方法也是最具破坏性的方式,只有在开发环境中才有可能。

删除所有迁移,删除数据库,创建新迁移并运行“update-database”。

硬/最安全的方法 这是最耗时的方法。我建议首先在本地集成分支中执行此操作,将其推送到远程集成,然后生成。

打开迁移文件,即20160914173357_MyNewMigration.cs。 按顺序删除所有索引 删除/添加/编辑表模式 添加所有索引。

对于任何一种方法,只需确保再次测试和测试。

答案 1 :(得分:2)

请勿修改ApplicationDbContextModelSnapshot。它是一个设计时工件,只应在合并冲突的情况下进行修改。

要更新模型,请始终使用数据注释或流畅的API。

有关EF迁移工作流程的详细信息,请参阅Code First Migrations。它适用于EF6,但大部分信息仍然相关。